题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析
分以下几种情况考虑:
(1)如果二叉树为空,返回空;
(2)如果该节点的右孩子存在,那么按中序遍历的思路,中序遍历中该节点的下一节点就是该节点的右孩子;
(3)如果该节点的右孩子不存在,且该节点是父节点的左孩子,那么返回该节点的父节点;
(4)如果该节点的右孩子不存在,且该节点是父节点的右孩子,那么需要一直往上遍历,直到遍历到的最近的父节点满足是上级节点的左孩子为止。
按照以上思路,写出代码。也可以画图分析。
代码
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next; //next即指向父节点的指针
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
//二叉树为空,返回空
if(pNode==nullptr)
return nullptr;
//如果节点的右孩子存在,则遍历该右孩子的左孩子,如果该左孩子不存在,则返回节点的右孩子
if(pNode->right != nullptr){
pNode = pNode->right;
while(pNode->left != nullptr){
pNode = pNode->left;
}
return pNode;
}
//如果节点的右孩子不存在,且该节点是节点的父节点的左孩子,那么返回该父节点;
//如果节点的右孩子不存在,且该节点是节点的父节点的右孩子,那么向上遍历,
//直到遍历到是左孩子;
while(pNode->next != nullptr){
TreeLinkNode* tmp = pNode->next;
if(tmp->left == pNode)
return tmp;
pNode = pNode->next;
}
return nullptr;
}
};