【代码随想录算法训练营第15天|层序遍历,226.翻转二叉树,101.堆成二叉树 】

代码随想录算法训练营第15天|层序遍历,226.翻转二叉树,101.堆成二叉树

一. 二叉树相关算法题

102.二叉树的层序遍历

思路
  • 通过队列的数据结构每一层读取节点数据
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        //定义队列动态的遍历二叉树中的元素
        Deque<TreeNode> deque = new LinkedList<>();
        if (root != null) deque.push(root);
        List<List<Integer>> list = new ArrayList<>();
        while (!deque.isEmpty()) {
            //每一层节点元素个数,一定要先取出来,因为下面出队列时长度时不断变化的
            int size = deque.size();
            List<Integer> temp = new ArrayList<>();
            //根据每层元素个数组装每层数组
            while (size-->0){
                //不断出队列当前层元素
                TreeNode node = deque.pollLast();
                temp.add(node.val);
                //出队列的同时把左右叶子节点入队,组装下一层节点元素
                if (node.left != null)
                deque.push(node.left);
                if (node.right != null)
                deque.push(node.right);
            }
            list.add(temp);
        }
        return list;
    }
}

226.翻转二叉树

递归法

思路
  • 递归遍历的基础上交换左右叶子节点
class Solution {
    public TreeNode invertTree(TreeNode root) {
        invertChild(root);
        return root;
    }

    public void invertChild(TreeNode cur){
        // 递归终止条件
        if (cur == null) return;
        TreeNode temp = cur.left;
        cur.left = cur.right;
        cur.right = temp;
        invertChild(cur.left);
        invertChild(cur.right);
    }
}

101.对称二叉树

递归法

思路
  • 可以简化抽象为判断两个子树是否对称
  • 两个子树是否对称的话可以拆解为左右子树的的外层和内层相同
  • 由此递归可以拆分如下:
    • 递归出入参:入参,左右子树根节点;出参,是否相等布尔值
    • 递归终止条件:左右节点为空或则不相等
//排除空姐点情况
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 outside = compare(left.left,right.right);
boolean inside = compare(left.right,right.left);
return outside & inside;
  • 具体代码实现如下
class Solution {
    public boolean isSymmetric(TreeNode root) {
        if (root==null) return  true;

        return compare(root.left,root.right);
    }

    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 outside = compare(left.left,right.right);
        boolean inside = compare(left.right,right.left);
        return outside & inside;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值