二叉树: 找一个节点的后继节点

问题描述:

有一种新的二叉树节点类型,结点中包含了一个指向父节点的parent指针(都能正确指向,头结点的parent指向null),

只给一个在二叉树中的某个节点node,实现返回node后继节点的函数。

知识点:在二叉树的“中序遍历”的序列中,node的下一个节点叫做node的“后继节点”,上一个节点叫node的“前驱节点”。

算法实现:

 

 //结点

class Node {

public int value;
public Node left;
public Node right;
public Node parent;

public Node(int value) {
this.value = value;
}

@NonNull
@Override
public String toString() {
return "Node [value = " + value + "]";
}
}

//方法

public Node getNextNode(Node node) {

if(node == null) {
return node;
}

if(node.right != null) {
return getLeftMost(node.right);
} else {

Node parent = node.parent;
while (parent != null && parent.left != node) {
node = parent;
parent = node.parent;
}
return parent;
}

}

public Node getLeftMost(Node node) {

if(node == null) {
return node;
}
while (node.left != null) {
node = node.left;
}
return node;
}
扫描二维码关注公众号,回复: 10732883 查看本文章

算法解析:

1.首先判断结点是否为空,为空则直接返回null(在算法中,“null”判断既是必要厨师判断操作,也是重要的终止条件判断)

2.如果当前结点的右节点不为null,则后继结点必然在右子树中,

(1)如果此右节点有左子树,则遍历此左子树直到最下层左叶子节点;

(2)如果此右节点无左子树,则当前结点即为要寻找的后继结点。

3.如果当前结点的右节点为null,则后继结点是当前结点的某个父节点(或者当前结点为最后一个节点,不存在后继节点)

(1)找到当前结点的父结点;

(2)当父节点不为空,且当前节点不是父节点的左节点时,需要向上迭代查找;

(3)向上查找时,将找到的父节点转化为子节点,寻找其父节点,并判断是否满足(2)中条件,满足则终止,返回父节点(即为要找的节点);

(4)如果直到父节点为null时,都没有能满足(2)中条件,说明待查找的节点没有后继地点(已经是最后一个节点)。

猜你喜欢

转载自www.cnblogs.com/heibingtai/p/12687654.html