剑指Offer P65 面试题8:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
public class Solution
{
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 pNow = pNode;
TreeLinkNode pParent = pNode.next;
while (pParent != null && pNow == pParent.right)
{
pNow = pParent;
pParent = pParent.next;
}
pNext = pParent;
}
return pNext;
}
}