代码随想录Day18

LeetCode 226  翻转二叉树

 

 

思路:遍历节点,交换左右孩子的顺序即可。前序遍历(中左右)、后序遍历(左右中)都可以,中序遍历这样写就行不通,会做多余的翻转操作。

遍历的写法:
1.确定参数和返回值   参数:根节点,返回值TreeNode。 这是题目规定好的,无需多言

2.终止条件      当前节点为空节点,返回

3.单层递归顺序。   前序,后序遍历都可。

 

迭代法的写法;
迭代法,主要是深度优先遍历和广度优先遍历的写法。

深度优先遍历(栈):  

1.当前节点不为空,压入栈

2.当栈内不为空,获取栈顶元素,出栈。

并交换栈顶元素的左右孩子

3.做前序遍历。如果栈顶存在左孩子,压入栈。左孩子遍历完再遍历右孩子。

 

广度优先遍历(层序遍历,队列):   把每层的值进行交换

广度优先遍历和深度优先遍历的不同之处在于。

广度优先遍历,拿到每一层的所有元素,进行一个顺序交换。深度优先遍历,从一个节点一直走下去,再往回走。

复制代码
//DFS递归
class Solution {
   /**
     * 前后序遍历都可以
     * 中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)
     */
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {
            return null;
        }
        invertTree(root.left);
        invertTree(root.right);
        swapChildren(root);
        return root;
    }

    private void swapChildren(TreeNode root) {
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
    }
}

//BFS
class Solution {
    public TreeNode invertTree(TreeNode root) {
        if (root == null) {return null;}
        ArrayDeque<TreeNode> deque = new ArrayDeque<>();
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size = deque.size();
            while (size-- > 0) {    //区别于深度优先遍历,拿到当前层的所有元素。深度优先遍历是当前元素不为空,就一直走下去。
                TreeNode node = deque.poll();
                swap(node);
                if (node.left != null) {deque.offer(node.left);}
                if (node.right != null) {deque.offer(node.right);}
            }
        }
        return root;
    }

    public void swap(TreeNode root) {
        TreeNode temp = root.left;
        root.left = root.right;
        root.right = temp;
    }
}
复制代码

 

posted @   NobodyHero  阅读(14)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示