题目
给定一可二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。
class BinaryTreeNode
{
char value;//节点的值
BinaryTreeNode left;//左子节点
BinaryTreeNode right;//右子节点
BinaryTreeNode parent;//父节点
}
思路
以面这颗二叉树为例
该二叉树的中序遍历序列为{d,b,h,e,i,a,f,c,g}。查找情况分为三种
- 节点有右子树,则它的下一个节点就是它的右子树的最左子节点,例如b的下一个节点就是h。
- 节点没有右子树,但是该节点是它父节点的左子节点,则该节点的下一个节点就是它的父节点,例如d的下一个节点就是b。
- 节点没有右子树,且该节点是它父节点的右子节点,这种情况比较复杂,我们可以沿着该节点的父节点一直向上遍历,直到找到一个节点是它父节点的左子节点,若该节点存在,则该节点的父节点就是我们要找的下一个节点, 否则,该节点就没有下一个节点。例如找i的下一个节点,我们沿着指向父节点的指针向上遍历,先到达e,因为e是它父节点的右子节点,所以继续向上到达e的父节点b,因为e还是它父节点的右子节点,所以继续向上遍历到达e的父节点b,因为b是它父节点的左子节点,所以,b的父节点a是i 的下一个节点。
代码实现
public static BinaryTreeNode getNext(BinaryTreeNode pNode)
{
//判断节点是否为空
if(pNode==null)
{
return null;
}
//存储节点的下一个节点
BinaryTreeNode pNext=null;
//节点有右子树
if(pNode.right!=null)
{
BinaryTreeNode pRight=pNode.right;
while(pRight.left!=null)
{
pRight=pRight.left;
}
pNext=pRight;
}
//节点没有右子树
else if(pNode.parent!=null)
{
BinaryTreeNode pCurrent=pNode;
BinaryTreeNode pParent=pNode.parent;
while(pParent!=null&&pParent.right==pCurrent)
{
pCurrent=pParent;
pParent=pParent.parent;
}
pNext=pParent;
}
return pNext;
}