题解 | #二叉树根节点到叶子节点的所有路径和#

二叉树根节点到叶子节点的所有路径和

https://www.nowcoder.com/practice/185a87cd29eb42049132aed873273e83

普通版的思路……时间复杂度比较高
    //这道题的本质是让我们记录每一条从根到叶子的路径
    //思路是用栈来做,每抵达一个叶子节点时,就把它从栈中弹出,然后访问栈顶
    //看看栈顶的节点还有没有未访问过的子节点能继续加入的,没有的话就继续弹出。
    //用递归做比较好,不然还得维护每个节点的两个子节点是否有被访问过。
    stack<TreeNode*> s;
    
    void Traverse(TreeNode* root,vector<vector<int> >&results)
    {
        vector<int>CurrentResult;
        if(root==NULL)
            return ;
        //新进栈一个节点。
        s.push(root);
        
        //如果来到了叶子节点,那么就出栈。
        if(root!=NULL && root->left==NULL && root->right==NULL){
            stack<TreeNode*> temp=s;
            //将栈中的内容拷贝到数组中。
            for(int i=0;i<s.size();i++)
            {
                CurrentResult.push_back(temp.top()->val);
                temp.pop();
            }
            s.pop();
            results.push_back(CurrentResult);
            //CurrentResult.clear();
            return;
        }
        
        //先尝试将其左右子节点也加入栈中。
        Traverse(root->left,results);
        Traverse(root->right,results);
        //倘若左右子树的递归已经都完成了,说明现在该回退了。
        s.pop();

        return;
    }
    
    int sumNumbers(TreeNode* root) {
        // write code here
        vector<vector<int> >results;
        Traverse(root,results);
        //所有路径和
        int sum=0;
        //位数
        int place=1;
        //单条路径和
        int localSum=0;
        for(auto result:results)
        {
            place=1;
            localSum=0;
            for(auto number:result)
            {
                localSum+=number*place;
                place*=10;
            }
            sum+=localSum;
        }
        return sum;
    }


全部评论

相关推荐

挣K存W养DOG:他真的很中意你,为什么不回他
点赞 评论 收藏
分享
爱看电影的杨桃allin春招:我感觉你在炫耀
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务