第57题 二叉树的下一个结点
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
/*
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) return nullptr;
if(pNode->right){
pNode = pNode->right;
while(pNode->left){
pNode = pNode->left;
}
return pNode;
}
while(pNode->next){
if(pNode->next->left == pNode){
return pNode->next;
}
pNode = pNode->next;
}
return nullptr;
}
};
思路:
三种情况:
1.右子树不为空,此时左子树遍历完毕,中序遍历右子树,先进入右子节点,在递归到右子树的最左节点。
2.右子树空,整个子树遍历完毕往上寻找,遍历根节点,若当前子树是根节点的左子树,则返回根节点,若为右子树,根节点已遍历,继续往上寻找,直到root节点。
3.最后一个节点,在2中找不到没有遍历过的根节点,所以返回空指针。