问题描述:node
有一种新的二叉树节点类型,结点中包含了一个指向父节点的parent指针(都能正确指向,头结点的parent指向null),算法
只给一个在二叉树中的某个节点node,实现返回node后继节点的函数。ide
知识点:在二叉树的“中序遍历”的序列中,node的下一个节点叫作node的“后继节点”,上一个节点叫node的“前驱节点”。函数
算法实现:this
//结点spa
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;
}
算法解析:.net
1.首先判断结点是否为空,为空则直接返回null(在算法中,“null”判断既是必要厨师判断操做,也是重要的终止条件判断)指针
2.若是当前结点的右节点不为null,则后继结点必然在右子树中,code
(1)若是此右节点有左子树,则遍历此左子树直到最下层左叶子节点;get
(2)若是此右节点无左子树,则当前结点即为要寻找的后继结点。
3.若是当前结点的右节点为null,则后继结点是当前结点的某个父节点(或者当前结点为最后一个节点,不存在后继节点)
(1)找到当前结点的父结点;
(2)当父节点不为空,且当前节点不是父节点的左节点时,须要向上迭代查找;
(3)向上查找时,将找到的父节点转化为子节点,寻找其父节点,并判断是否知足(2)中条件,知足则终止,返回父节点(即为要找的节点);
(4)若是直到父节点为null时,都没有能知足(2)中条件,说明待查找的节点没有后继地点(已是最后一个节点)。
本文分享 CNBlog - 黑冰台。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。