二叉樹的映象

低吟不作語發表於2020-10-06

操作給定的二叉樹,將其變換為源二叉樹的映象。假設題目所給的二叉樹如下所示



解法一

思路很簡單,既然要求映象,只要將每一個結點的左右子結點交換一下位置就好了。使用中序遍歷可以幫助我們實現這一想法

public class Solution {
    private TreeNode temp;
    public void Mirror(TreeNode root) {
        if(root == null) {
            return;
        }
        temp = root.left;
        root.left = root.right;
        root.right = temp;
        Mirror(root.left);
        Mirror(root.right);
    }
}

解法二

解法一雖然簡單粗暴,但如果碰到大資料就直接炸了。我們還是使用遞迴的思想,思考遞迴的時候不要一步步看它執行了啥,思考的方式應該是首先假設子問題都已經完美處理,然後只需要處理最終的問題即可。子問題的處理方式與最終那個處理方式一樣,但是問題規模一定要逐漸縮小,最後給一個遞迴出口條件即可

對於本題,首先假設 root 的左右子樹已經都處理好了,即左子樹自身已經映象了,右子樹自身也映象了,那麼最後一步就是交換左右子樹,問題解決。下面進入遞迴,就是處理子問題。子問題的處理方式與 root 一樣,只是要縮小問題規模,所以只需要考慮 root.left 是什麼情況,root.right 是什麼情況即可

public class Solution {

    public void Mirror(TreeNode root) {
    	// 為空則結束
        if(root == null) {
            return;
        }
        // 假設 root 的左右子樹都已經完成映象了
        // 那就讓左右子樹交換
        swap(root);
        // 左子樹做映象操作
        Mirror(root.left);
        // 右子樹做映象操作
        Mirror(root.right);
    }
    
    private void swap(TreeNode node) {
        TreeNode temp = null;
        temp = node.left;
        node.left = node.right;
        node.right = temp;
    }
}

當然,也可以使用棧來模擬上面的過程。開始執行方法時入棧,方法執行完畢時出棧

import java.util.Stack;
public class Solution {
    
    private Stack<TreeNode> stack = new Stack<>();
    
    public void Mirror(TreeNode root) {
        if(root == null) {
            return;
        }
        stack.push(root);
        while(!stack.empty()) {
            TreeNode node = stack.pop();
            swap(node);
            if(node.left != null) {
                stack.push(node.left);
            }
            if(node.right != null) {
                stack.push(node.right);
            } 
        }
    }
    private void swap(TreeNode node) {
        TreeNode temp = null;
        temp = node.left;
        node.left = node.right;
        node.right = temp;
    }
}

相關文章