题目总结与代码归档:
【剑指offer-2】题目目录【C++版本】
GitHub代码路径: GitHub
面试题8
二叉树的下一个节点
题目:给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。树节点定义如下:
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft; // 指向左子节点的指针
BinaryTreeNode* m_pRight; // 指向右子节点的指针
BinaryTreeNode* m_pParent; // 指向父节点的指针
};
解题思路
如图中序遍历序列是{d,b,h,e,i,a,f,c,g}。假设节点X为当前节点,找中序遍历序列的下一个节点
1、若 X 有 右子树 , X下一个节点为其右子树的最左节点(m_pLeft 指针一直向下),eg: b 的下一个节点为h; a 的下一个节点为 f
2、若 X 没有右子树,且 X以及其父节点, 如果 存在一节点Y,X以及其父节点是Y的左子节点,那么Y的为X的下一节点, eg: d 的下一个节点为 b, h 的下一个节点为 e, i 的下一个节点为 a;如果一直到根节点也没有这样一节点Y,就不存在 下一个节点 eg: g 没有下一节点
代码实现
#include <stdio.h>
struct BinaryTreeNode
{
int m_nValue;
BinaryTreeNode* m_pLeft; // 指向左子节点的指针
BinaryTreeNode* m_pRight; // 指向右子节点的指针
BinaryTreeNode* m_pParent; // 指向父节点的指针
};
BinaryTreeNode* GetNext(BinaryTreeNode* pNode)
{
if (pNode == nullptr)
return nullptr;
BinaryTreeNode* pNext = nullptr;
// 判断是否有 右子树
if (pNode->m_pRight != nullptr)
{
// 有 右子树
BinaryTreeNode* pRight = pNode->m_pRight;
while (pRight->m_pLeft != nullptr) // 找 最左节点
pRight = pRight->m_pLeft;
pNext = pRight;
}
else if (pNode->m_pParent != nullptr)
{
// 没有 右子树
BinaryTreeNode* pCurrent = pNode; // 当前节点
BinaryTreeNode* pParent = pNode->m_pParent; // 父节点
while (pParent != nullptr )
{
if (pCurrent == pParent->m_pLeft)
{
break;
}
// 迭代 找 父节点 直到
// 1、 pParent 为 nullptr , 这个是已到根节点
// 2、 pCurrent 不是 pParent 的 右子节点, pCurrent 是 pParent 的 左子节点
pCurrent = pParent;
pParent = pParent->m_pParent;
}
pNext = pParent;
}
return pNext;
}
参考资料:
GitHub链接:
https://github.com/lichangke
CSDN首页:
https://me.csdn.net/leacock1991
欢迎大家来一起交流学习