以目前所学的知识而言,对于二叉树涉及递归相关的问题,一般需要设定两个返回条件:
1、二叉树左子树或右子树遍历完后,即节点为NULL时需要返回。
2、当前节点满足题目要求时,需要对相应参数做出改变,或是直接返回相应参数。
代码及思路:
代码:
//摘自牛客网
/*** struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/
/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param root TreeNode类 * @return int整型*/
int sumOfLeftLeaves(struct TreeNode* root ) {// write code hereif(root == NULL){return 0;}int sum = 0;if(root->left && root->left->left == NULL && root->left->right == NULL){sum+=root->left->val;}sum += sumOfLeftLeaves(root->left) + sumOfLeftLeaves(root->right);return sum;
}
思路:
对于涉及递归的问题,最好的滤清思路的方式是画图解决。以图一所示的二叉树结点为例:
图一:
在此需要知道的是:递归过程是一个不断向系统申请空间,并在一定条件下返回同时释放空间的过程,且每个空间都是独立的,即使是同一个函数,同一个变量名,他们都是独立的,除了传址(传引用)变化。通过下图(图二)来分析图一中的递归过程。
图二:
从根节点开始:
初始时,两个 if 条件均不满足,因此再次调用 sumOfLeftLeaves 函数,访问其左节点。
当来到图一 节点2,此时满足第二个 if 条件,通过相应算式,使得 sum = 4;但返回值仍然不确定,因此需要继续递归 sumOfLeftLeaves 函数,继续访问左节点。
当来到图一3节点,同样不满足两个 if 条件,继续递归左节点,此时左节点已为 NULL,
返回 0 (蓝色线)回到上一次调用该函数的位置处,并继续递归右子节点,同样返回 0,此时 节点4 的 sum += 0+0 = 0,返回 sum= 0,回到上一次调用该函数的位置处(即,节点2),开始调用 节点 2 的右子树,同理也会得到返回值 sum = 0,此时 sum += 0 + 0;
但先前的 节点2 满足第二个 if 条件,此时 节点2 中的 sum = 4 (左节点的值),因此返回 sum =4,最终在根节点中得到了左子树正确的返回值,同理再次遍历右节点可以得到返回值为 6,
最终得 sum += 4 + 6;