題目:
給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
知識點:
二叉樹的中序遍歷:左、根、右。
二叉樹的前序遍歷:根、左、右。
二叉樹的後序遍歷:左、右、根。
思路:
由於二叉樹的中序遍歷是:左、根、右。因此,拿到的節點一定已經遍歷完它的左子樹了。
1、如果該節點的右子樹不爲空,
如果右子樹的左節點不爲空,返回右子樹的最深左節點;
返回右子樹根節點;
2、如果該節點根不爲空,
如果根的右子樹不是它自己,則返回根節點;
如果根的右子樹是它自己,繼續向上遍歷,找根節點,循環條件2。
3、都不滿足,返回空。
答案:
/*
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode next = null;
TreeLinkNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode==null){return null;}
/*if(pNode.left!=null){//左子樹已經遍歷完
while(pNode.left!=null){
pNode = pNode.left;
}
return pNode;
}*/
if(pNode.right!=null){
TreeLinkNode p = pNode.right;
while(p.left!=null){
p = p.left;
}
return p;
}
if(pNode.next!=null){
while(pNode.next!=null){
if(pNode.next.right!=pNode){
return pNode.next;
}else{
pNode = pNode.next;
}
}
}
return null;
}
}