题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题目分析
以该二叉树为例,中序遍历为:{D,B,H,E,I,A,F,C,G};
总体可以分为有无右子树这两种情况:
1.有右子树,下一结点是右子树中的最左结点,例如 B,下一结点是 H
2.无右子树,又可以分为两种小情况。就是寻找父结点路径上的第一个右父结点。
无右子树,且结点是该结点父结点的左子树,则下一结点是该结点的父结点,例如 H,下一结点是 E。
无右子树,且结点是该结点父结点的右子树,则我们一直沿着父结点追朔,直到找到某个结点是其父结点的左子树,如果存在这样的结点,那么这个结点的父结点就是我们要找的下一结点。例如 I,下一结点是 A;例如 G,并没有符合情况的结点,所以 G 没有下一结点。
代码
C++代码如下:
/*
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->right)
{
pNode=pNode->right;//判断此结点是否有右子树
while(pNode->left)
pNode=pNode->left;//寻找右子树的最左结点,最左结点就是下一个结点
return pNode;
}
else
{
//判断是否是 父结点的右结点的情况
while(pNode->next&&pNode==pNode->next->right)
pNode=pNode->next;
return pNode->next;
}
}
};