LeetCode 热题 100——二叉树——对称二叉树 & 二叉树的直径

对称二叉树

题目描述

给你一个二叉树的根节点 root , 检查它是否轴对称。

示例 1:

输入:root = 1,2,2,3,4,4,3

输出:true

示例 2:

输入:root = 1,2,2,null,3,null,3

输出:false

提示:

树中节点数目在范围 1, 1000 内

-100 <= Node.val <= 100

进阶:你可以运用递归和迭代两种方法解决这个问题吗?

求解

(1)递归

使用两个指针p,q,一开始指向 根节点,分别进行遍历,分别判断当前节点是否相等、 左子树的左节点是否和右子树的右节点相等 以及 左子树的右节点 是否与 右子树的左节点相等。

js 复制代码
var check = function(p, q) {
    if (!p && !q) return true;
    if (!p || !q) return false;
    return p.val === q.val && check(p.left, q.right) && check(p.right, q.left);
}
var isSymmetric = function(root) {
    // 递归,使用两个指针,遍历树
    // 一开始都指向 根节点
    if (!root) return true;
    return check(root.left, root.right);
};

(2)迭代

层序遍历,把null也放进去判断。我自己手搓的 有点 冗余了。

js 复制代码
var isSymmetric = function(root) {
    // 层序遍历
    if (!root) return true;
    let queue = [];
    queue.push(root);
    while(queue.length !== 0) {
        let temp = [];
        for (let node of queue) {
            if (node) {
                temp.push(node.left);
                temp.push(node.right);
            }
        }
        for (let i = 0; i < temp.length / 2; i++) {
            let p = temp[i], q = temp[temp.length - i - 1];
            if (p && q) {
                if (p.val !== q.val) return false;
            } else if (!p && !q) {
                continue;
            } else {
                return false;
            }
        }
        queue = temp;
    }
    return true;
};

改进:可在遍历当前层时直接处理对称位置;代码:

js 复制代码
var isSymmetric = function(root) {
    if (!root) return true;
    let queue = [root.left, root.right];
    while (queue.length !== 0) {
        let p = queue.shift();
        let q = queue.shift();
        if (!p && !q) continue;
        if (!p || !q || p.val !== q.val) return false
        queue.push(p.left, q.right);
        queue.push(p.right, q.left);
    }
    return true;
};

二叉树的直径

题目描述

给你一棵二叉树的根节点,返回该树的 直径 。

二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。

两节点之间路径的 长度 由它们之间边数表示。

示例 1:

输入:root = 1,2,3,4,5

输出:3

解释:3 ,取路径 4,2,1,3 或 5,2,1,3 的长度。

示例 2:

输入:root = 1,2

输出:1

提示:

树中节点数目在范围 1, 104 内

-100 <= Node.val <= 100

求解

一开始的想法就是 考虑根节点 左右两边子树的 深度,但是可能答案也会出现在子树上。

js 复制代码
var getLength = function(root) {
    if (!root) return 0;
    return Math.max(getLength(root.left), getLength(root.right)) + 1
}
var diameterOfBinaryTree = function(root) {
    if (!root) return 0;
    let leftMax = getLength(root.left);
    let rightMax = getLength(root.right);
    return leftMax + rightMax;
};

上面这个代码有误,当答案出现在子树上就会解答错误。

正确代码:

js 复制代码
var diameterOfBinaryTree = function(root) {
    if (!root) return 0;
    let max = 0;
    const getLength = (root) => {
        if (!root) return 0;
        let leftMax = getLength(root.left);
        let rightMax = getLength(root.right);
        max = Math.max(max, leftMax + rightMax)
        return Math.max(leftMax, rightMax) + 1
    }
    getLength(root);
    return max;
};
相关推荐
.道阻且长.4 分钟前
Linux基本开发工具:编译器gcc/g++
linux·运维·服务器·职场和发展
Yuzhiyuxia11 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU11411 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi11 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David12 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院13 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng13 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~16 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py17 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法