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

102. 二叉树的层序遍历

思路:考虑到要使二叉树的每一层实现先进先出,故使用队列来存放每一层中的节点。

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {

        Queue<TreeNode> queue = new LinkedList();

        List<List<Integer>> result = new ArrayList();

        if(root == null) {
            return result;
        }

        queue.add(root);

        while(!queue.isEmpty()) {

            List<Integer> temp = new ArrayList();
            int size = queue.size();

            while(size > 0) {

                TreeNode node = queue.poll();
                temp.add(node.val);
                size--;

                if(node.left != null) {
                    queue.add(node.left);
                }

                if(node.right != null) {
                    queue.add(node.right);
                }
            }
            result.add(temp);
        }
        return result;
    }
}

小结:值得注意的点

  • 当一层中的节点进入队列后,使用一个临时变量来引用相应的出队的元素并添加相应的左孩子和右孩子,最后结合队列的大小来判断当前层的遍历是否结束
  • 对于二叉树为空时的特殊情况需要单独考虑

226. 翻转二叉树

思路:只要把每一个节点的左右孩子翻转一下,就可以达到整体翻转的效果。于是考虑可以递归实现,对以左右孩子为根节点的子树递归地进行交换节点。

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

        TreeNode temp = null;
        temp = root.left;
        root.left = root.right;
        root.right = temp;

        invertTree(root.left);
        invertTree(root.right);

        return root;
    }
}

小结:值得注意的点

  • 递归的终止条件的确定

101. 对称二叉树

思路:该题实际是比较两个子树的里侧和外侧的元素是否相等,于是可以考虑使用递归。通过判断里侧和外侧的值相与是否为true来确定这棵树是不是对称二叉树。

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return false;
        }
        return compaer(root.left, root.right);
    }

    public boolean compaer(TreeNode left, TreeNode right) {
        if(left == null && right != null) {
            return false;
        }

        if(left != null && right == null) {
            return false;
        }

        if(left == null && right == null) {
            return true;
        }

        if(left.val != right.val) {
            return false;
        }

        boolean compaerInside = compaer(left.right, right.left);
        boolean compaerOutside = compaer(left.left, right.right);
        return compaerInside && compaerOutside;
    }
}

小结:值得注意的点

  • 对节点为空的四种情况考虑
  • 单层递归的逻辑:比较二叉树外侧是否对称—>比较内测是否对称—>如果左右都对称就返回true ,有一侧不对称就返回false
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值