给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了两个分别指向左右子节点的指针,还有一个指向父节点的指针。
如下面这颗二叉树:
思路:找出中序遍历中某个节点的下一个节点大概有三种情况
- 如果该节点有右子树,那么它的下一个节点就是它右子树中的最左子节点。
- 如果该节点没有右子树,并且它是它父节点的左子节点,那么它的父节点就是该节点的下一个节点。
- 如果该节点没有右子树,并且它是父节点的右子节点的话,那么我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么它的父节点就是我们所要找的节点
根据这个思路可以写出如下代码:
struct BinaryTreeNode
{
int val;
BinaryTreeNode* leftchild;
BinaryTreeNode* rightchild;
BinaryTreeNode* parent;
};
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
if (pNode == nullptr)
{
return nullptr;
}
BinaryTreeNode* pNext = nullptr;
if (pNode->rightchild != nullptr)
{
BinaryTreeNode* right = pNode->rightchild;
while (right->leftchild != nullptr)
{
right = right->leftchild;
}
pNext = right;
}
else if (pNode->parent != nullptr)
{
BinaryTreeNode* pcurrent = pNode;
BinaryTreeNode* Parent = pNode->parent;
while (Parent != nullptr && pcurrent == Parent->rightchild)
{
pcurrent = Parent;
Parent = Parent->parent;
}
pNext = Parent;
}
return pNext;
}