題目描述
操作給定的二叉樹,將其變換爲源二叉樹的鏡像。
輸入描述:
解題思路
題意就是 交換二叉樹中每個結點的兩個子女
1. 遞歸實現
- 先交換先交換左右孩子的左右子樹
- 再交換左右孩子
該解法見C++代碼
2. 非遞歸實現
採用廣度遍歷算法 + 隊列實現(深度遍歷也可)
- 將根節點入隊
- 取出根結點並交換根節點的左右孩子
- 左右孩子已被交換完畢,將其依次入隊
- 取出隊頭結點並交換該結點的左右孩子
- 左右孩子已被交換完畢,將其依次入隊
- 依次類推,直到隊空。。。
該解法見Java代碼
具體代碼
- C++ 遞歸實現
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void Mirror(TreeNode *root) {
if(root != NULL){
Mirror(root->left);
Mirror(root->right);
TreeNode *temp = root->left;
root->left = root->right;
root->right = temp;
}
}
};
- Java 非遞歸實現
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.LinkedList;
import java.util.Queue;
public class Solution {
public void Mirror(TreeNode root) {
if(root == null)
return ;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root); //根節點入隊
while(!queue.isEmpty()){
// 隊列非空
int len = queue.size();
for(int i = 0;i<len;i++){
TreeNode curr = queue.poll(); //取出隊頭
//交換該結點的左右孩子
TreeNode temp = curr.left;
curr.left = curr.right;
curr.right = temp;
if(curr.left != null) //若該節點有左孩子,則將其入隊,等待交換
queue.offer(curr.left);
if(curr.right != null)
queue.offer(curr.right); //若該節點有右孩子,則將其入隊,等待交換
}
}
}
}
👉 👉 👉 原文首發 - 小牛肉的個人博客,歡迎來訪~👈 👈 👈