给定一颗二叉树和其中的一个节点,如何找出中序遍历的下一个节点?树中的节点除了两个分别指向左右子节点的指针,还有一个指向父节点的指针。
如下面这颗二叉树:

思路:找出中序遍历中某个节点的下一个节点大概有三种情况
- 如果该节点有右子树,那么它的下一个节点就是它右子树中的最左子节点。
- 如果该节点没有右子树,并且它是它父节点的左子节点,那么它的父节点就是该节点的下一个节点。
- 如果该节点没有右子树,并且它是父节点的右子节点的话,那么我们可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么它的父节点就是我们所要找的节点
根据这个思路可以写出如下代码:
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;
}
这篇博客介绍了如何在具有父节点指针的二叉树中找到中序遍历下个节点的方法。主要分为三种情况:1) 如果节点有右子树,下一个节点是右子树中最左的节点;2) 若节点是父节点的左子节点,父节点即为下一个节点;3) 若节点是父节点的右子节点,向上遍历直到找到父节点的左子节点。给出了相应的C++代码实现。
16万+

被折叠的 条评论
为什么被折叠?



