这个结构比普通的二叉树节点结构多了一个指向父节点的perent指针。
假设有一颗Node类型的节点组成二叉树,树中的每个节点的parent指针都正确的指向自己的父节点,头结点的parent指向null。只给一个在二叉树中的某个节点node,请返回实现node的后继节点的函数。在二叉树的中序遍历的序列中,node的下一个节点叫做node的后继节点。在二叉树的中序遍历的序列中,node的前一个节点叫做node的前驱节点。
思路1:
通过parent找到头结点
然后中序遍历整棵二叉树,返回遍历后node的下一个节点
思路2:
通过二叉树结构,
node有右子树,那么node的后继节点一定是他整个右子树最左的节点
node没有右子树,要找到谁的左子树是以node结尾的,往上找,直到node是当前节点的左孩子,返回
9,没有右子树,向上找到了5,但是9并不是5的左孩子,再向上找到到了2,但是5也不是2的左孩子,在向上找,找到了1,这时候9正好是1的左孩子,返回1
1,有右子树,这个时候去找右子树最左边的节点,到了3,3还有左孩子,找到了6,返回6
public static Node getSeccessorNode(Node node) {
if (node == null) {
return node;
}
if (node.right != null) { //有右子树
return getLeftMost(node.right);
} else {
Node parent = node.parent; //拿node的parent
while (parent != null && parent.left != node) { //当前节点等于父亲的左孩子了那就停
node = parent; //两个指针一起向上走
parent = node.parent;
}
return parent;
}
}
private static Node getLeftMost(Node node) { //找最左边的节点
if (node == null) {
return node;
}
while (node.left != null) {
node = node.left;
}
return node;
}
针对最右边的节点,他的后继就是null,这个时候他会一直向上找,去找他作为左孩子的那么父亲,结果找到头还是找不到,头的父亲是null,索性就直接返回这个null。
找前驱
同理
如果node有左子树,那么就是左子树的最右边的节点
如果node没有左子树,向上找,找他作为右孩子的父亲
public static Node getPrecursor(Node node) {
if (node == null) {
return null;
}
if (node.left != null) {
return getRightMost(node.left);
} else {
Node parent = node.parent;
while (parent != null && parent.right != null) {
node = parent;
parent = node.parent;
}
return parent;
}
}
private static Node getRightMost(Node node) {
// TODO Auto-generated method stub
if (node == null) {
return node;
}
if (node.right != null) {
node = node.right;
}
return node;
}