Day 14 | 102.二叉树层序遍历(广度优先BFS)& 226.反转二叉树 & 101. 对称二叉树

卡哥给了十道题。。都是二叉树bfs算法的相关应用,由于!时间问题!我就先写了第一道纯遍历题。

102.二叉树层序遍历

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

解题思路:

①定义队列que存放结点,List<List>存放遍历结果集。

②将头结点加入队列。

③循环遍历队列(每一层)。while(!que.isEmpty())

④定义size为当前层数的节点个数。遍历每个节点。for(int i=0;i<size;i++)

⑤定义node存放当前遍历的结点,将该节点弹出队列并存放在List中。

⑤判断该结点是否有左右孩子,若有加入到队列中。

⑥遍历完当前层后,将存放该层结点的List加入到List<List>中

⑦返回List<List>

注意:遍历每一层结点时,循环终止条件必须是常量size!不能是变量que.size()!que的大小是每次都会变化的!

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> resList = new ArrayList<List<Integer>>();
        if(root==null) return resList ;
        Queue<TreeNode> que=new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int size=que.size();
            List<Integer> list=new ArrayList<>();
            for(int i=0;i<size;i++){
                TreeNode node = que.poll();
                list.add(node.val);
                if(node.left!=null){que.offer(node.left);}
                if(node.right!=null){que.offer(node.right);}
            }
            resList.add(list);
        }
        return resList;
    }
}

 226.反转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]

本题用递归解决问题,前后序遍历只需交换节点顺序即可。

中序遍历由于先遍历交换了左子树,此时的左子树已经变为了右子树。因此需要再交换左子树。其实为(左中左)顺序完成交换。

我一开始自己写swap函数时,直接将root的左右孩子作为参数传递,但结果并没有进行交换

后来提问了之后知道了直接将left,right节点进行交换的话只是改变了左右节点,但对于它们父节点parent的left和right引用并没有改变!所以还是要传入父节点然后改变左右节点。

错误代码:

 正确:

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null){return root;}
           swap(root);     
        invertTree(root.left);

        invertTree(root.right);
        return root;
    }
    public void swap(TreeNode node){
        TreeNode temp=node.left;
        node.left=node.right;
        node.right=temp;
    }
}

 101. 对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。

本题使用递归实现。

①首先判断左右节点空指针是否对称,不对称直接返回false。

②排除空指针后,判断左右节点数值是否相等。

③递归调用,判断左右子树外侧数值是否相等(left.left && right.right)

④递归调用,判断左右字数内侧数值是否相等(left.right && right.left)

⑤最后返回内外侧判断结果的值即可。

注意:本题只能使用后序(左右/右左 中都可以)遍历,因为前/中序遍历没有对左右子树比较完毕就进行返回。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        return compare(root.left,root.right);
    }
    public boolean compare(TreeNode left,TreeNode right){
        if(left==null&&right==null){return true;}
        else if(left==null&&right!=null){return false;}
        else if(left!=null&&right==null){return false;}
        else if(left.val!=right.val){return false;}
        boolean out=compare(left.left,right.right); //左
        boolean in=compare(left.right,right.left);  //右
        return out&&in; //中
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值