题目:给定一棵二叉树和其中的一个节点,找到中序遍历序列中该节点的下一个节点,树中节点有指向左孩子、右孩子及父节点的三个指针。
思路:根据当前节点在树中的位置,分为3种情况:
1、给定节点有右子树,则下一个节点为其右子树的最左节点;
2、给定节点没有右子树,但该节点是其父节点的左子树,则下一个节点为当前节点的父节点;
3、给定节点没有右子树且是其父节点的右子节点,则沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点 的左子节点的节点,若这样的节点存在,则这个节点的父节点就是给定节点的下一个节点。
实现:
struct BinaryTreeNode
{
int value;
BinaryTreeNode* parent; //指向父节点
BinaryTreeNode* lchild;
BinaryTreeNode* rchild;
};
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
BinaryTreeNode* pNext = NULL;
if (!pNode) return NULL;
if (pNode->rchild)
{
BinaryTreeNode* temp = pNode->rchild;
while (temp)temp = temp->lchild;
pNext = temp;
}
else if(pNode->parent)
{
BinaryTreeNode* curNode = pNode;
BinaryTreeNode* parentNode = pNode->parent;
//沿着父节点一直遍历,直到找到是父节点左子节点的节点为止
while (parentNode && curNode == parentNode->rchild)
{
curNode = parentNode;
parentNode = parentNode->parent;
}
pNext = parentNode;
}
return pNext;
}