题解 | #二叉树的下一个结点#

二叉树的下一个结点

http://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e

二叉树的下一个节点

方法一:暴力法

/*
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:
    vector<TreeLinkNode*> v;
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        TreeLinkNode* r = pNode;
        while(r->next)//找到根节点
            r = r->next;
        inorder(r);
        for(int i = 0;i < v.size();++i){
            if(v[i] == pNode && i+1 < v.size())
                return v[i+1];
        }
        return NULL;
    }
    void inorder(TreeLinkNode* r){
        if(!r)return;
        inorder(r->left);
        v.push_back(r);
        inorder(r->right);
    }
};

方法二:

分情况:

	 如果有右子树,那么中序的下一个为右子树的最后一个左子树
     如果没有右子树,判断节点在树的左子树还是右子树,如果左子树那么下一个就是它的父节点中的一个。如果在右为空。
/*
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->right){//有右节点,即右节点的左子树即下一个节点
            pNode = pNode->right;
            while(pNode->left)
                pNode = pNode->left;
            return pNode;
        }
        while(pNode->next){//判断当前在树的左树还是右树
            if(pNode->next->left == pNode)//如果在左树
                return pNode->next;
            pNode = pNode->next;
        }
        return NULL;
    }
};
全部评论

相关推荐

孤寡孤寡的牛牛很热情:为什么我2本9硕投了很多,都是简历或者挂,难道那个恶心人的测评真的得认真做吗
点赞 评论 收藏
分享
斑驳不同:还为啥暴躁 假的不骂你骂谁啊
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务