1.题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
2.解题思路
- 首先判断是否为空树,为空树则返回空指针。
- 判断结点是否有右子树。
- 有右子树,则在该右子树中遍历左子树,直至左子树为空,则返回上一结点即可。
- 无右子树,则要考虑的多一些:
a. 该结点父结点为空,则直接返回空结点。
a. 为父结点的左子节点,则直接返回该结点的父结点。
b. 为父结点的右子节点,则从该结点沿着指向父结点的指针一路遍历,直到找到结点为其父结点的左子结点,则返回该结点的父结点。如果直到结点的父结点为空时也没有找到,则返回空指针。
3.代码实现
//二叉树的结点
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
//寻找二叉树的下一节点
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == nullptr) //判断是否为空树
{
return nullptr;
}
if(pNode->right != nullptr) //判断结点是否有右子树
{
TreeLinkNode* temp;
pNode = pNode->right;
while(pNode!=nullptr) //寻找右子树的左子树
{
temp = pNode;
pNode = pNode->left;
}
return temp;
}
else if(pNode->next != nullptr) //判断父节点是否非空
{
TreeLinkNode* temp = pNode;
TreeLinkNode* parent = pNode->next;
while(parent!=nullptr && temp == parent->right) //判断父结点是否为空,且该节点是否为其父结点的右子结点
{
temp = parent;
parent = parent ->next;
}
return temp->next;
}
else //父节点为空等情况
{
return nullptr;
}
}