LeetCode二叉樹專題 (10) 翻轉(zhuǎn)二叉樹

image

題目

image

題目地址

解題思路

這道題比較簡單,大家可以自己先想想
。。。
。。。
??
。。。
??
。。。

反轉(zhuǎn)二叉樹的目的就是交換每個結(jié)點的左右結(jié)點

遞歸解題

子問題就出來,交換兩個結(jié)點即可。對每一個遞歸到的元素都執(zhí)行這個操作。返回值和終止條件就是遍歷完所有元素返回根結(jié)點。

迭代解題

如果使用層序遍歷,也只要在遍歷下面的一層時,交換左右子樹即可。
比如,上面的樹為例,第一層是4,第二層是7,2。遍歷4時,我們交換7和2,然后放入隊列中,遍歷7和2時,同樣如此。

遞歸代碼

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            //終止條件為空時
            return null;
        }
        //子問題:交換左右子樹
        TreeNode left = root.left;
        root.left = root.right;
        root.right = left;
        
        //遞歸上面的子問題
        invertTree(root.left);
        invertTree(root.right);
        
        //返回結(jié)果
        return root;
    }
}

迭代代碼

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode invertTree(TreeNode root) {
        //使用隊列
        LinkedList<TreeNode> list = new LinkedList<>();
        list.add(root);
        while(!list.isEmpty()){
            TreeNode tree = list.poll();
            if(tree != null){
            
                //交換左右兩個結(jié)點
                TreeNode left =  tree.left;
                tree.left = tree.right;
                tree.right = left;
                
                //BFS
                if(tree.left != null){
                    list.add(tree.left);
                }
                if(tree.right != null){
                    list.add(tree.right);
                }
            }
        }
        return root;
    }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容