题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。
分析如下:1、如果该节点是普通节点(该情况适用于根节点),如果它的右孩子存在,则需要找它的有孩子的左子节点,直到找到叶子节点,这个叶子节点就是下一个节点了;由于是中序遍历,左孩子的情况不用考虑了。2、如果该节点是父节点的左孩子,则下一个节点就是其父节点了;如果是父节点的右孩子,就需要遍历其父节点的父节点,重复之前的判断,返回结果。3、如果树为空,则返回空!
typedef struct BinaryTreeNode
{
int m_nValue;
struct BinaryTreeNode *m_pLeft;
struct BinaryTreeNode *m_pRight;
struct BinaryTreeNode *m_pParent;
}BinaryTreeNode;
BinaryTreeNode *GetNext(BinaryTreeNode* pNode)
{
if(pNode == NULL)
return 0;
BinaryTreeNode* pNext = NULL;
if(pNode->m_pRight != NULL)
{
BinaryTreeNode* pRight = pNode->m_pRight;
while(pRight->m_pLeft != NULL)
pRight = pRight->m_pLeft;
pNext = pRight;
}
else if(pNode->m_pParent != NULL)
{
BinaryTreeNode* pParent = pNode->m_pParent;
while(pParent != NULL && pCurrent == pParent->m_pRight)
{
pNode = pParent;
pParent = pParent->m_pParent;
}
pNext = pParent;
}
return pNext;
}