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

二叉树的下一个结点

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;
    }
};
全部评论

相关推荐

不懂!!!:感觉你的项目描述太简单了,建议使用star描述法优化提炼一下,就是使用什么技术或方案解决了什么问题,有什么效果或成果,例如:对axios进行了二次封装,实现了请求的统一管理、错误的集中处理以及接口调用的简化,显著提高了开发效率和代码维护性,使用canvas技术实现了路线绘制功能,通过定义路径绘制函数和动态更新机制,满足了简化的导航可视化需求,提升了用户体验。像什么是使用其他组件库,基本功能描述就最好不要写到项目成果里面去了,加油
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务