剑指offer-二叉树的下一个节点

来源:互联网 发布:手机淘宝淘宝客 编辑:程序博客网 时间:2024/06/10 18:18

问题

题目:[剑指offer-二叉树的下一个节点]

思路

先说思路,由于求的是中序遍历二叉树的下一个节点。所以,分清楚集中情形即可。
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;    }};