劍指Offer -18 - 二叉樹的鏡像 - C++/Java

題目描述

操作給定的二叉樹,將其變換爲源二叉樹的鏡像。

輸入描述:
在這裏插入圖片描述

解題思路

題意就是 交換二叉樹中每個結點的兩個子女

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); //若該節點有右孩子,則將其入隊,等待交換
            }
        }
    }   
}


👉 👉 👉 原文首發 - 小牛肉的個人博客,歡迎來訪~👈 👈 👈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章