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