给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针
根据下面二叉树中序遍历的结果:
1>.NULL节点中序遍历的下一个节点为NULL;
2>.如果给定的节点pNode存在右子树,则中序遍历下一个节点是右子树的最左节点;
3>.如果给定节点pNode不存在右子树,pNode为其父节点的左子树,则下一个节点是pNode的父节点;pNode为欸其父节点的右子树,则沿着父节点的路径向上查找,直到找到没有父节点的节点切实沿着此节点的左子树查找上去的,则下一个节点就是该没有父节点的节点
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==NULL)
{
return NULL;
}
TreeLinkNode* ReNode=NULL;
//该节点有右子树,则下一个节点就是右子树的最左节点
if(pNode->right!=NULL)
{
TreeLinkNode* node=pNode->right;
while(node->left)
{
node=node->left;
}
ReNode=node;
}
//该节点没有右子树
else if(pNode->right==NULL)
{
//该节点位于父节点的左节点,则下一个节点就是父节点
TreeLinkNode* parent=pNode->next;
if(parent&&pNode==parent->left)
{
ReNode=parent;
}
//该节点位于父节点的右节点,则顺着父节点路径向上进行查找,
//直到找到父节点为空的节点,并且是从从左子树节点回溯上来的
else if(parent&&pNode==parent->right)
{
while(parent&&pNode==parent->right)
{
pNode=parent;
parent=pNode->next;
}
ReNode=parent;
}
}
return ReNode;
}
};