題目描述
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
分析
- 如果有右子樹:那就是右子樹的最左節點
- 如果沒有右子樹:向上找祖先,如果它是該祖先的左子孫,則是; 如果找不到,那本身就是最後一個節點,下一個是null
代碼
public class TreeLinkNode {
public int val;
public TreeLinkNode left = null;
public TreeLinkNode right = null;
public TreeLinkNode next = null; //指向父節點
public TreeLinkNode(int val)
{ this.val = val;
}
}
public TreeLinkNode getNext(TreeLinkNode n){
if (n==null)return null;
if (n.right!=null){//有右子樹:找右子樹最左節點
TreeLinkNode left = n.right;
while (left.left!=null)left= left.left;
return left;
}else{//沒有右子樹,找爲其左子孫的第一個祖先。
TreeLinkNode father = n;
while (father!=null){
if (father.next!=null && father.next.left == father)return father.next;
father = father.next;
}
return null;//找不到,那它本身就是最後一個,下一個是null
}
}
擴展思考
如果是前序,怎麼找?
- 有左子節點,就是左子節點
- 沒有左子節點:
- 有右子節點:就是右子節點
- 沒有右子節點(葉節點):向上找,找祖先的右子節點(異己的)
如果是後序,怎麼找?
後序說明當前節點的子節點都在自己前面,只有父節點在自己後面。
- 如果沒有父節點(根節點):下一個是null
- 有父節點:
- 父節點右子節點是自己或者爲空:下一個就是父節點
- 父節點右子節點不爲空且不是自己(即作爲左節點):找該右子樹的最左節點