列表

详情


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

描述

给定一个二叉树的根节点root,该树的节点值都在数字 之间,每一条从根节点到叶子节点的路径都可以用一个数字表示。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n

例如根节点到叶子节点的一条路径是,那么这条路径就用 来代替。
找出根节点到叶子节点的所有路径表示的数字之和
例如:

这颗二叉树一共有两条路径,
根节点到叶子节点的路径 用数字 代替
根节点到叶子节点的路径 用数字 代替
所以答案为

数据范围:节点数 ,保证结果在32位整型范围内
要求:空间复杂度 ,时间复杂度
进阶:空间复杂度 ,时间复杂度 

示例1

输入:

{1,2,3}

输出:

25

示例2

输入:

{1,0}

输出:

10

示例3

输入:

{1,2,0,3,4}

输出:

257

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 0ms, 内存消耗: 8552KB, 提交时间: 2015-04-03

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode *root) {
        int result=0;
        sumNumbers2(root, result);
         
        return result;
    }
     
    void sumNumbers2(TreeNode *root, int &result)
    {
        if(root == NULL)
        {
            return;
        }
         
        path.push_back(root->val);
         
        if(root->left==NULL && root->right==NULL)
        {
            int sum=0;
            for(vector<int>::iterator it=path.begin();it!=path.end();it++)
            {
                sum=sum*10+*it;
            }
            result+=sum;
        }
         
        if(root->left!=NULL)
        {
            sumNumbers2(root->left, result);
        }
        if(root->right!=NULL)
        {
            sumNumbers2(root->right, result);
        }
        path.pop_back();
    }
private:
    vector<int> path;
};

C++ 解法, 执行用时: 0ms, 内存消耗: 8552KB, 提交时间: 2015-04-03

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode *root) {
        if (root == NULL)
            return 0;
        if ((root->left == NULL) && (root->right == NULL))
            return root->val;
        stack <TreeNode *> pstack;
        stack <int> vstack;
        TreeNode *ptr = root;
        int sum = 0, temp = 0;
        int flag;
        while(ptr){
            flag = 0;
            temp = temp * 10 + ptr->val;
            if(ptr->right != NULL){
                pstack.push(ptr->right);
                vstack.push(temp);
                flag = 1;
            }
            if(ptr->left != NULL){
                ptr = ptr->left;
            }
            else{
                if(!flag){
                    sum += temp;
                }
                if(!pstack.empty()){
                    ptr = pstack.top();
                    pstack.pop();
                    temp = vstack.top();
                    vstack.pop();
                }
                else
                    break;
            }
        }
        //delete ptr;
        return sum;
    }
};

C++ 解法, 执行用时: 0ms, 内存消耗: 8552KB, 提交时间: 2015-03-28

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
   int sumNumbers(TreeNode *root) {
		if (root == NULL)
			return 0;
		
		return calc(root, 0);
	}

	int calc(TreeNode* root, int curVal) {
		//if is leaf
		if (root->left == NULL && root->right == NULL)
			return curVal * 10 + root->val;
		
		int leftVal = 0, rightVal = 0;
		if (root->left != NULL)
			leftVal = calc(root->left, curVal * 10 + root->val);
		if (root->right != NULL)
			rightVal = calc(root->right, curVal * 10 + root->val);
		return leftVal + rightVal;
	}
};

C++ 解法, 执行用时: 0ms, 内存消耗: 8552KB, 提交时间: 2015-03-27

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int sumNumbers(TreeNode *root) {
        int sum = 0;
		int number = 0;
		Total(root, number, sum);
		return sum;
	}
	void Total(TreeNode *root, int number,int &sum)
	{
		if (root == NULL)
		{
			sum += number;
			return;
		}
		number = number * 10 + root->val;
		if (root->left == NULL&&root->right == NULL)
		{
			sum += number;
			return;
		}
		if (root->left != NULL)
			Total(root->left, number, sum);
		if (root->right != NULL)
			Total(root->right, number, sum);
		return;
    }
};

C++ 解法, 执行用时: 0ms, 内存消耗: 8552KB, 提交时间: 2015-03-11

class Solution {
public:
    int sumNumbers(TreeNode *root) {
        return dfs( root, 0);
    }
    int dfs(TreeNode *root, int sum) {
        if ( root == nullptr ) return 0;
        if ( root->left == nullptr && root->right == nullptr )
               return sum * 10 + root->val;
        return dfs(root->left, sum * 10 + root->val)
              + dfs(root->right, sum * 10 + root->val);
    }
};

上一题