代码改变世界

Leetcode-Sum Root to Leaf Numbers

2017-05-19 15:28  tlnshuju  阅读(149)  评论(0编辑  收藏  举报

题目:

Given a binary tree containing digits from 0-9 only, each root-to-leaf path could represent a number.

An example is the root-to-leaf path 1->2->3 which represents the number 123.

Find the total sum of all root-to-leaf numbers.

For example,

    1
   / \
  2   3

The root-to-leaf path 1->2 represents the number 12.
The root-to-leaf path 1->3 represents the number 13.

Return the sum = 12 + 13 = 25.

       这道题使用递归来解决很优雅。代码也简洁明了。

       我是在LeetCode OJ上提交了自己的代码,Accepted后才看该题的Discuss的。看到非常多人使用的方法跟我的一样(额...,应该说我的跟非常多人的一样。)

      以下给出我自己的代码,为了測试的方便,我也写了使用前序创建二叉树的代码。

#include <iostream>

using namespace std;

//Definition for binary tree
struct TreeNode {
	int val;
	TreeNode *left;
	TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

// 使用前序遍历来创建二叉树
void createBinaryTree(TreeNode **T)
{
	int val;
	cin >> val;
	// 因为每一个节点的值都是0-9,所以就用-1表示空节点
	if(val == -1)
		*T = NULL;
	else
	{
		*T = new TreeNode(val);
		if(*T == NULL)
		{
			cout << "out of space!" << endl;
			return;
		}
		createBinaryTree(&(*T)->left);
		createBinaryTree(&(*T)->right);
	}
}

// 核心递归算法
void calculateSum(TreeNode *root, int currentNum, int &sum)
{
	// 
	if( root == NULL )
		return;
	currentNum = currentNum * 10 + root->val;
	// 叶子节点
	if ( root->left == NULL && root->right == NULL )
	{
		sum += currentNum;
		return;
	}
	// 遍历左子树
	calculateSum(root->left, currentNum, sum);
	// 遍历右子树
	calculateSum(root->right, currentNum, sum);
}

int sumNumbers(TreeNode *root)
{
	if(root == NULL)
		return 0;
	int sum = 0;
	calculateSum(root, 0, sum);
	return sum;
}

int _tmain(int argc, _TCHAR* argv[])
{
	TreeNode *bTree;
	createBinaryTree(&bTree);
	int sum = sumNumbers(bTree);
	cout << "Sum : " << sum << endl;
	return 0;
}

比如题目中的树,前序创建时输入: 1, 2。 -1, -1, 3, -1, -1

输出结果为: Sum : 25