leetcode第一刷_Sum Root to Leaf Numbers

2014-11-24 12:34:36 · 作者: · 浏览: 1

有关树的问题还是比较简单的,递归递归递归,递归一万年。不,你说还有,遍历遍历遍历,遍历一万年,哈哈。一般的问题借助前中后层序都可以比较优雅的解决掉,遍历的时候常用递归,如果层序,可能需要借助队列。

这道题其实没什么好说的,父亲们在构成的数字中位数靠前,一定是先序遍历嘛,到达叶子更新一下总和。这里说实验室一个同学面试遇到的更有意思的问题,也是树的。已知树上两个节点有祖先和后辈的关系,怎样只用一次遍历把所有他们之间所有节点染成红色?答案是后序遍历。为什么呢,我直观的讲,树的本质是什么呢,是一个伦理问题,一个父亲可以有很多孩子,而一个孩子只能有一个父亲。这说明什么呢,说明从上往下走,可以有很多种走法,但往上走的路径一定是唯一的。我觉得这是树和图最大的区别,也是为什么树的问题比图的简单很多。既然只能把路径之间的染成红色,且只用一次遍历,那么走确定路径,一定是回溯的时候做的。当然这个题还不完整,具体怎么染,还有很多细节,我就不说了,我只想传达我对遍历的一种理解。

ac代码:

void sumAll(TreeNode *root, int &sum, int tpNum){
    tpNum = tpNum*10+root->val;
    if(!root->left&&!root->right)
        sum += tpNum;
    if(root->left)
        sumAll(root->left, sum, tpNum);
    if(root->right)
        sumAll(root->right, sum, tpNum);
}


class Solution {
public:
    int sumNumbers(TreeNode *root) {
        if(root == NULL)
            return 0;
        int res = 0;
        sumAll(root, res, 0);
        return res;
    }
};