代码随想录训练营第十三天| LeetCode 102. 二叉树的层序遍历、LeetCode 226. 翻转二叉树、LeetCode 101. 对称二叉树

LeetCode 102. 二叉树的层序遍历

题目链接:102. 二叉树的层序遍历

思路:使用队列来进行遍历。首先根结点先入队列。此时队列中已经有元素了。当队列为空即为循环的终止条件。定义一个变量size用于每次循环记录二叉树每一层结点的个数,用于控制内层循环的次数,从而达到每次输出一层的元素。目前根结点在队列中。size=1,让队列队首元素加入数组,然后让指针指针该元素对应的树中结点(这就要求队列中存的是结点而不是结点的中的数据)。让该元素出队。此时size--,刚刚指针指向了对应树中的结点。然后让该结点的左孩子入队,再右孩子入队,size--此时内层循环结束。然后再继续处理其左右孩子即可。

具体实现:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList();
        List<List<Integer>> res1 = new ArrayList();
        Deque<TreeNode> deque = new LinkedList();
        if(root==null){
            return res1;
        }
        deque.add(root);
        while (!deque.isEmpty()){
            int size = deque.size();
            List<Integer> list = new ArrayList<>();
            while (size>0){
                TreeNode node = deque.peek();
                list.add(node.val);
                deque.poll();
                size--;
                if(node.left!=null){
                    deque.add(node.left);
                }
                if(node.right!=null){
                    deque.add(node.right);
                }
            }
            res.add(list);
        }
        return res;
        
    }
}

图解:

LeetCode 226. 翻转二叉树

题目链接:226. 翻转二叉树

思路:二叉树的题目其实大多都可以往递归方面想。其实从他给出的示例可以看出,要对二叉树进行翻转,就要对其中从根结点开始的每一个结点的左右孩子进行交换。这就涉及到递归了。想到这其实就很好操作了。

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null){
            return null;
        }
        //交换逻辑
        TreeNode p=null;
        p=root.left;
        root.left = root.right;
        root.right = p;
        //递归操作
        //即对每一个结点都要对齐左右孩子进行交换
        invertTree(root.left);
        invertTree(root.right);
        return root;

    }
}

LeetCode 101. 对称二叉树

题目链接:101. 对称二叉树

思路:这道题和上一道题有点类似,但个人感觉这道要难一点。其实如果弄不清递归的化,我们就举一个常态的二叉树来进行模拟。就比如他给出的示例这一道。如何判断一棵树是对称呢?从根结点开始。要判断其左右孩子的值是否相等。如果相等要继续判断的化,就是要判断其左孩子的左孩子和右孩子的右孩子是否相等,还要再判断左孩子的右孩子和右孩子的左孩子是否相等。以这个逻辑递归下去。就能针对每一个结点判断它的孩子结点是否对称。这样就写好了.

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 false;
        } else if (left==null &&right!=null) {
            return false;
        } else if (left==null&&right==null) {
            return true;
        }else if (left.val!=right.val){
            return false;
        }

        boolean a=compare(left.left,right.right);
        boolean b=compare(left.right,right.left);

        return a&&b;
    }
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值