/**
* 二叉樹的下一個節點
* 給定一顆二叉樹和其中的一個節點,找到其後繼節點(中序遍歷中的下一個節點就是後繼節點)
* <p>
* 1.如果一個節點有右子樹,那麼後繼節點就是右子樹中的最左節點。
* 2.如果一個節點無右子樹並且是它父節點的左節點,那麼它的後繼節點就是父節點。
* 3.如果一個節點無右子樹並且是它父節點的右節點,那麼沿着父節點向上遍歷,找到一個節點是它父節點的左孩子節點,
* 如果該節點存在,那麼這個節點的父節點就是後繼節點。
*
* @param root
* @param cur
* @return
*/
public Node getNext(Node root, Node cur) {
if (null == root || null == cur) return root;
//默認該節點已存在
if (cur.right != null) {
Node right = cur.right;
while (right.left != null && right.left.left != null)
right = right.left;
return right;
} else {
Node parent = cur.parent;
if (parent.left == cur) return parent;
if (parent.right == cur) {
while (parent.parent != null) {
Node parentParent = parent.parent;
if (parentParent.left == parent)
return parentParent;
parent = parent.parent;
}
}
}
return null;
}
public class Node {
public int value;
public Node left;
public Node right;
public Node parent;
public Node(int data) {
this.value = data;
}
}
劍指Offer學習-面試題8:二叉樹的下一節點
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.