题目:给定一棵二叉树和其中的一个节点,如果找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左,右子节点的指针,还有一个指向父节点的指针;类型如下:
public class TreeLinkNode {
int val;
TreeLinkNode left = null;
TreeLinkNode right = null;
TreeLinkNode father = null;TreeLinkNode(int val) {
this.val = val;
}
}
话不多说,先撸上代码:
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
if(pNode==null){
return null;
}
if(pNode.right!=null){
pNode = pNode.right;
while(pNode.left!=null)
pNode = pNode.left;
return pNode;
}
while(pNode.father!=null){
if(pNode.father.left==pNode){
return pNode.father;
}
pNode = pNode.father;
}
return null;
}
分析:在中序遍历中,先取左字节点,再取根节点。
在一棵二叉树中,有三种情况;1)该节点位于父节点的左节点上,例如如中的4位于2的左字节点上,那么4的下一个节点必定是2;
2)该节点存在右节点,那么下一个节点便是右子节点的最左子节点。例如3节点,存在右子节点,那么3的下一个节点便是8。4节点的下一个节点是7.
3)如果该节点没有子节点,且位于父节点的右边,我们沿着指向父节点的指针遍历,直到找到一个是他父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要寻找的节点。例如7节点向上遍历,到4节点,4是 2的左子节点,因此2便是我们要寻找的节点。2是7的下一个节点。