题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
/*
该节点是左子树 并且它无右子树 中序遍历的下一个是它的根节点。
该节点是左子树 并且它有右子树 它右子树的最左边。
该节点是右子树 并且它无右子树 并且 它的根是左子树 中序遍历的下一个是它的根节点的根节点。
该节点是右子树 并且它无右子树 并且 它的根是右子树 中序遍历的下一个是null。
该节点是右子树 并且它有右子树 它右子树。
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL)
return NULL;
if(pNode->next==NULL)//目标结点是根节点
{
if(pNode->right==NULL)
return NULL;//根节点 无右子树的话 是中序遍历的最后一个结点
//有右子树 是它右子树的最左边结点。
pNode=pNode->right;
while(pNode->left!=NULL)
pNode=pNode->left;
return pNode;
}
if(pNode->next->left==pNode)//目标结点是其根的左子树
{
if(pNode ->right==NULL)//该节点是左子树 并且它没有右子树
return pNode ->next;//根节点
//有右子树 是它右子树的最左边结点。
pNode=pNode->right;
while(pNode->left!=NULL)
pNode=pNode->left;
return pNode;
}
// if(pNode->next->right==pNode)//目标结点是其根的右子树
{
if(pNode ->right==NULL)//该节点是右子树 并且它没有右子树
{
if(pNode->next->next==NULL)//它的父节点是树的根节点
return NULL;
if(pNode->next->next->left==pNode->next)//它的父节点 是左子树
return pNode->next->next;
return NULL;
}
//该节点是右子树 有右子树 是它右子树。
return pNode->right;
}
}
};