二叉树的下一个结点
题目
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解决方案
- 若该节点有右子树,则返回右字数的最左边节点(或者根节点)
- 若该节点没有右子树,但该节点是父节点的左子树,则返回父节点
- 若该节点没有右子树,且是父节点的右子树,则不断回溯,直到找到某个节点是父节点的左子树,返回父节点;或追溯到根节点,返回空指针
代码
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == nullptr)
return pNode;
TreeLinkNode* pNext = nullptr;
// 如果该节点有右节点,则返回该右节点的最左子节点
if(pNode->right != nullptr)
{
TreeLinkNode* pRight = pNode->right;
while(pRight->left != nullptr)
{
pRight=pRight->left;
}
return pRight;
}
// 如果该节点没有右子树,则向上追溯
else if(pNode->next != nullptr)
{
TreeLinkNode* current = pNode;
TreeLinkNode* parent = pNode->next;
//若目前节点是父节点的左子树,则输出父节点;若不是则继续追溯,直到找到是父节点左子树的节点,或者找到根节点(即父节点为空)
while(parent != nullptr && current == parent->right)
{
current = parent;
parent = parent->next;
}
pNext = parent;
}
return pNext;
}
};