【中等】二叉树的下一个结点- 2.29

76 阅读2分钟

题目链接:

题解:

/*
 * function TreeNode(x) {
 *   this.val = x;
 *   this.left = null;
 *   this.right = null;
 * }
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param pRoot TreeNode类 
 * @return bool布尔型
 */
function IsBalanced_Solution( pRoot ) {
    // write code here

    // 定义一个标志位,表示是否为平衡二叉树,默认为true,是平衡二叉树
    let flag = true

    // 定义一个深度优先搜索函数,用来计算节点高度并检查是否平衡
    function dfs(root) {
        // 如果结点不存在或者已经不是平衡二叉树了,返回高度0
        if (!root || !flag) return 0

        // 递归计算左子树的高度
        let left = dfs(root.left)

        // 递归计算右子树的高度
        let right = dfs(root.right)

        // 如果左右子树高度差大于1,说明不平衡,将flag设置为false
        if (Math.abs(left - right) > 1) {
            flag = false
            return
        }

        // 返回当前节点的高度,为左右子树最大值加1
        return Math.max(left, right) + 1
    }

    // 调用深度优先搜索函数,开始遍历树
    dfs(pRoot)

    // 返回标志位,表示整个树是否是平衡二叉树
    return flag
}

总结:

  1. function TreeLinkNode(x){ - 这行是一个被注释掉的函数定义,看起来是定义了一个 TreeLinkNode 类,但在这段代码中没有被使用到。

  2. function GetNext(pNode) { - 这是一个函数的定义,接受一个参数 pNode,表示二叉树中的某个节点,函数的目标是找到这个节点在中序遍历中的下一个节点。

  3. let head = pNode; - 在这里,head 被初始化为参数 pNode,表示当前节点,这个变量会被用来向上找到整个二叉树的根节点。

  4. while (head.next !== null) { - 这个 while 循环会一直向上找到根节点,根据 next 指针,直到 head 没有 next 为止,这时 head 就是根节点。

  5. const list = []; - 创建一个空数组 list,用于存储中序遍历的结果(二叉树的节点)。

  6. function dfs(root) { - 这是一个递归函数 dfs,用于进行中序遍历。

    • if (!root) return; - 如果当前节点不存在(为空),则直接返回。
    • dfs(root.left); - 递归调用 dfs 函数,处理左子树。
    • list.push(root); - 将当前节点加入 list 数组,实现中序遍历的存储。
    • dfs(root.right); - 递归调用 dfs 函数,处理右子树。
  7. dfs(head); - 调用 dfs 函数,从根节点开始进行中序遍历,结果会存储在 list 数组中。

  8. let pIndex = list.indexOf(pNode); - 找到参数 pNodelist 中的索引,即找到它在中序遍历中的位置。

  9. return list[pIndex + 1]; - 返回 listpIndex 后面一个位置的节点,即参数 pNode 在中序遍历中的下一个节点。

这段代码的主要思路是先进行中序遍历,将结果存储在数组中,然后通过数组来找到给定节点的下一个节点。