问题
思路
先说思路,由于求的是中序遍历二叉树的下一个节点。所以,分清楚集中情形即可。
1. 如果右子树存在,一定是右子树的最左下节点。
2. 如果右子树不存在,那就可能是它的爷爷节点,这时也需要一个判断就是,如果父节点是爷爷节点的左子树,此时,第一个爷爷节点就是中序遍历的下一个节点,注意可能不存在,比如父亲一直都不是爷爷的左孩子。
代码
/*
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 NULL;
TreeLinkNode* right = pNode->right;
if( right ) return leftbottom( right );
else return firstfather( pNode, pNode->next );
}
private:
TreeLinkNode* leftbottom(TreeLinkNode* r){
while(r->left){
r = r->left;
}
return r;
}
TreeLinkNode* firstfather(TreeLinkNode* child, TreeLinkNode* f){
while(f){
if( child == f->right ){
child = f;
f = f->next;
}else return f;
}
return NULL;
}
};