二叉树的下一节点
1、题目
给定一颗二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右子节点的指针,还有一个指向父节点的指针。
输入参数:二叉树的一个节点
输出参数:二叉树的下一个节点
2、解题
这道题的关键在于不同节点下一个节点的寻找方式,这里可分为两个大方向,三种寻找方式
- 如果该节点右节点存在,那么下一个节点是右子树的最左节点
- 如果该节点右节点不存在,在父节点存在的前提下
- 如果该节点是父节点的左节点,那么下一个节点是父节点
- 如果该节点是父节点的右节点,那么沿着向上遍历,直到搜寻到某个节点,是其父节点的左节点,那么下一个节点是父节点
两个大方向按照所给节点是否有右节点而划分,因为题目是**中序遍历,所以把重点放在左节点是没有意义的**,因为左节点必然已经遍历结束,所以下一个节点应该着眼于右子树上。
3、完整代码
BinaryTreeNode* GetNext(BinaryTreeNode* pNode) {
//1、鲁棒性检查
if (pNode == nullptr)
return nullptr;
//2、初始化
BinaryTreeNode* pNext = nullptr;
BinaryTreeNode* pRight = pNode->m_pRight;
//3、判断右子树
if (pRight != nullptr) {
while (pRight->m_pLeft != nullptr)
pRight = pRight->m_pLeft;
pNext = pRight;
}
//4、右子树为空,先对父节点做判断
else if (pNode->m_pParent != nullptr) {
BinaryTreeNode* current = pNode;
BinaryTreeNode* parent = pNode->m_pParent;
//5、寻找那个是父节点的左节点的节点
while (parent != nullptr && current == parent->m_pRight) {
current = parent;
parent = parent->m_pParent;
}
pNext = parent;
}
//6、返回节点即可
return pNext;
}
4、注意点
- 开头的鲁棒性检查
- 若右子树不存在,则直接else if对父节点进行检查,避免浪费时间
- 寻找那个是父节点的左节点的节点时,子节点和父节点两个指针交替上行,时刻注意判断父节点是否为空