✅✅代码随想录算法训练营Day15 || 层序遍历 10 ,226.翻转二叉树 ,101.对称二叉树 2

116 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第7天,点击查看活动详情🚀🚀

102. 二叉树的层序遍历 - 力扣(LeetCode)

image.png

var levelOrder = function(root) {
    let queue = [];
    let res = [];
    if(!root) {
        return res
    } 
    queue.push(root)
    while(queue.length){
        let len = queue.length
        let level = [];
        for(let i = 0;i < len ;i++){
            let top = queue.shift();
            level.push(top.val);
            if(top.left){
                queue.push(top.left)
            }
            if(top.right){
                queue.push(top.right)
            };
        }
        res.push(level)
    }
    return res
};

难点

二叉树的层序遍历,就是模拟一个队列的出队入队过程。

  1. 边界条件:当队列的长度为空时,表示二叉树已遍历完毕,可以返回最后的res数组
  2. 先把队列队头的结点出队,返回的结果为top,表示队头。
  3. 判断top是否有左右子节点,有则将其加入队列。

226. 翻转二叉树 - 力扣(LeetCode)

image.png

var invertTree = function(root) {

        if(!root){
            return root;
        }
        
         let left = invertTree(root.left)
         let right = invertTree(root.right)
         
         root.right = left;
         root.left = right;

        return root
    
};

难点

翻转二叉树,其实就是每一棵子树的左孩子和右孩子都发生了交换。并且这个交换的流程是从下到上。

既然是“每一棵子树”,那么就意味着重复,既然涉及了重复,就没有理由不用递归。

于是这道题解题思路就非常明确了:以递归的方式,遍历树中的每一个结点,并将每一个结点的左右孩子进行交换。

101. 对称二叉树 - 力扣(LeetCode)

image.png

var isSymmetric = function(root) {

    if(!root)
        return root;


    const compare = (left,right) =>{
        if((left == null && right != null)||(left != null && right == null))
            return false;
        else if(!left && !right)
            return true;
        else{
            if(left.val != right.val){
                return false;
            }
        }

        let out = compare(left.left,right.right)
        let In = compare(left.right,right.left)
        
        return out&&In

    }

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

难点

  • 对称的关键就是同时比较外侧和内侧二叉树结点
  • 同时遍历两颗二叉树
  • 处理递归的边界条件
    • 左节点为空,右节点不为空,不对称,return false
    • 左不为空,右为空,不对称 return false
    • 左右都为空,对称,返回true
    • 左右都不为空,比较节点数值,不相同就return false