题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指针
分析:若一个结点有右子树,那么它的下一个结点就是它的右子树中最左子结点,即从右子结点出发一直沿着指向左子结点的指针,我们就能找到它的下一个结点。若一个结点没有右子树,且该结点是父结点的左子结点,则它的下一个结点就是它的父结点;若该结点是父结点的右子结点,我们可以沿着指向父结点的指针一直向上遍历,直到找到一个是它父结点的左子结点的结点,如果这样的结点存在,那么这个结点的父结点就是我们要找的下一个结点
public class wr58GetNext {
public TreeLinkNode GetNext(TreeLinkNode pNode){
if(pNode==null){
return null;
}
TreeLinkNode pNext=null;
// 当结点有右孩子,下一个结点是右子树中的最左子结点
if(pNode.right!=null){
TreeLinkNode pRight=pNode.right;
while(pRight.left!=null){
pRight=pRight.left;
}
pNext=pRight;
}
// 若无右孩子,如果该结点是父结点的左孩子,则返回父结点
// 若该结点是父结点的右孩子,则向上遍历,直到找到一个是它父结点的左子结点的结点
else if(pNode.next!=null){
TreeLinkNode cur=pNode;
TreeLinkNode parent=pNode.next;
while(parent!=null && cur==parent.right){
cur=parent;
parent=parent.next;
}
pNext=parent;
}
return pNext;
}
}