题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
解题思路
1、若该结点存在右子树:则下一个结点为右子树最左子结点(如图节点 B、C、E )
2、若该结点不存在右子树:
(1)该节点为父结点的左子结点,则下一个节点为其父结点(如图节点 D、H、F )
(2)该节点为父结点的右子结点,则沿着父结点向上遍历,直到找到一个结点的父结点的左子结点为该结点,则该结点的父结点为下一个结点(如图结点 I ,沿着父结点一直向上查找找到 B ( B 为其父结点的左子节结点),则 B 的父结点 A 为下一个结点)
(3)结点无父结点 ,即结点为根结点
注意父结点在定义中表示为pNode->next
实现代码
/*
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 pNode;
if(pNode->right != NULL){ // 结点有右子树
pNode = pNode->right;
while(pNode->left != NULL) //下一个结点为右子树最左子结点
pNode = pNode->left;
return pNode;
}
else if(pNode->next != NULL && pNode->next->left == pNode) { // 结点无右子树且该结点为父结点的左子结点
return pNode->next;
}
else if(pNode->next != NULL && pNode->next->right == pNode) { // 结点无右子树且该结点为父结点的右子结点
while(pNode->next != NULL && pNode->next->left != pNode){
pNode = pNode->next ;
}
return pNode->next;
}
else{
return pNode->next ;//结点无父结点 ,即结点为根结点
}
}
};