代码随想录 day15

本文探讨了层序遍历在二叉树中的应用,介绍了如何使用队列实现并举例说明。随后,解析了翻转二叉树和判断对称二叉树的思路,重点讲解了前序和后序遍历在这些问题中的关键作用。关键词包括队列、层序遍历、翻转操作、对称性检查。
摘要由CSDN通过智能技术生成

层序遍历

题目链接:层序遍历

解题思路: 顾名思意,一层一层地遍历这棵树,由这一点我们可以想到,要保留这一层的遍历值,又要给下一层的遍历开放入口,且要定好遍历的终止条件。受卡尔的启发,我选择使用队列这个数据结构来存放所遍历的值,然后根据层来加入result结果集。这里需要指定一个size变量,来记录每一层元素的数量。

解题代码:

var levelOrder = function(root) {
    let queue = [];
    let result = [];
    let size = 0;
    if(root)queue.push(root);
    while(queue.length){
        size = queue.length;
        let vec = [];
        while(size--){
            let cur = queue[0];
            queue.shift();
            vec.push(cur.val);
            if(cur.left){
                queue.push(cur.left);
            }
            if(cur.right){
                queue.push(cur.right);
            }
        }
        result.push(vec);
    }
    return result;
};

翻转二叉树

题目链接: 翻转二叉树
解题思路: 题目很简单,就是翻转左右子树
在这里插入图片描述
首先应该弄清楚的是使用哪种遍历,使用前序和后序遍历是最直接的,这里不推荐使用中序遍历,在思路上有点麻烦,在代码上也有点麻烦。可以这么想吧,翻转的时候我们可以从上层的左右节点开始翻转,也可以从下边的左右节点开始翻转,但是先翻转左子树的,然后再翻转上层的左右子树的就会造成一些混乱,左子树翻转好后回到上一层翻转,再转到右子树,可刚刚处理的就是这棵树,可以画图试一试。

解题代码:

var swap = function(leftNode,rightNode,root){
    root.left = rightNode;
    root.right = leftNode;
}
// 前序遍历
var invertTree = function(root){
    // 终止条件
    if(!root)return null;
    swap(root.left,root.right,root);
    invertTree(root.left);
    invertTree(root.right);
    return root;
}

对称二叉树

题目链接: 对称二叉树
解题思路: 由题意,本质上就是看根节点的左子树和右子树是否能翻转,注意,这道题我们只能使用后序遍历,为什么?因为只有后序遍历我们才能把是否相等的信息返回给上一层,如果是使用前序,后边的还没处理呢,怎么知道结果呢,如果是中序,就很乱了,其实说到这,也不是说使用前序或是中序不行,就是用这俩个写代码的话有点多,要处理很多逻辑。
解题代码:

var isSymmetric = function (root) {
    let left = root.left;
    let right = root.right;
    let compare = function(left,right){
        if(!left && right)return false;
        else if(left && !right)return false;
        else if(!left&&!right)return true;
        else if(left.val !== right.val)return false;
        let outside = compare(left.left,right.right);
        let inside = compare(left.right,right.left);
        let result = outside && inside;
        return result;
    }
    return compare(left,right);
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值