题目
一颗树的后继节点:中序遍历时,该节点的后一个;一颗树的前驱节点:中序遍历时,该节点的前一个;现有一颗二叉树,且每个节点都有一个parent指针指向父节点。求指定节点的后继节点
- 方式一:收集中序遍历节点,然后比较节点取后一个
- 方式二:按照中序遍历规则
- 如果该节点有右子树:则后继节点为右子树最左边的节点
- 如果该节点没有右子树:
- 则应该向上取parent遍历,如果存在有节点是其上级节点的左子节点,则后继节点为该上级节点
- 如果没有节点是其上级节点的左节点,则说明没有后继节点,返回null
function back(node) {
if (!node) {
return node;
}
if (node.right) {
//获取右树最左边的节点
return getLeftMost(node.right);
} else {
//此方式包含了没有右子树的两种情况
let parentNode = node.parent;
while (parentNode != null && parentNode.left != node) {
node = parentNode;
parentNode = node.parentNode;
}
return parentNode;
}
}
function getLeftMost(node) {
if (!node) {
return node;
}
while (node.left != null) {
node = node.left;
}
return node;
}