题目链接:
- 牛客网:二叉树的下一个结点
题解:
/*
* 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
}
总结:
function TreeLinkNode(x){ - 这行是一个被注释掉的函数定义,看起来是定义了一个 TreeLinkNode 类,但在这段代码中没有被使用到。
function GetNext(pNode) { - 这是一个函数的定义,接受一个参数 pNode,表示二叉树中的某个节点,函数的目标是找到这个节点在中序遍历中的下一个节点。
let head = pNode; - 在这里,head 被初始化为参数 pNode,表示当前节点,这个变量会被用来向上找到整个二叉树的根节点。
while (head.next !== null) { - 这个 while 循环会一直向上找到根节点,根据 next 指针,直到 head 没有 next 为止,这时 head 就是根节点。
const list = []; - 创建一个空数组 list,用于存储中序遍历的结果(二叉树的节点)。
function dfs(root) { - 这是一个递归函数 dfs,用于进行中序遍历。
- if (!root) return; - 如果当前节点不存在(为空),则直接返回。
- dfs(root.left); - 递归调用 dfs 函数,处理左子树。
- list.push(root); - 将当前节点加入 list 数组,实现中序遍历的存储。
- dfs(root.right); - 递归调用 dfs 函数,处理右子树。
dfs(head); - 调用 dfs 函数,从根节点开始进行中序遍历,结果会存储在 list 数组中。
let pIndex = list.indexOf(pNode); - 找到参数 pNode 在 list 中的索引,即找到它在中序遍历中的位置。
return list[pIndex + 1]; - 返回 list 中 pIndex 后面一个位置的节点,即参数 pNode 在中序遍历中的下一个节点。
这段代码的主要思路是先进行中序遍历,将结果存储在数组中,然后通过数组来找到给定节点的下一个节点。