题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
思路
首先可以分为两大类:
1、有右子树的,那么下个结点就是右子树最左边的点;
2、没有右子树的,此时又可以分为两类:
2.1 该结点是父结点的左孩子,那么父结点就是下一个结点 ;
2.2 该结点是父结点的右孩子,此时应寻找他父结点的父结点的父结点…直到当前结点是其父结点的左孩子位置。如果没有父结点,那么他就是尾结点,返回null。
代码
function GetNext(pNode)
{
if(!pNode){return null;} //空树
var p = null;
if(pNode.right){ //存在右子树,则找右子树的左子树,直到没有左子树为止
p = pNode.right;
while(p.left){
p=p.left;
}
}else{ //不存在右子树
p=pNode.next; //此结点是其父结点的左孩子
if(pNode.next && pNode.next.right == pNode){ //此结点是其父结点的右孩子
while(p.next && p.next.right == p){
p = p.next;
}
if(p.next == null){
p = null;
}else{
p = p.next;
}
}
}
return p;
}