二叉树——左叶子节点之和

以目前所学的知识而言,对于二叉树涉及递归相关的问题,一般需要设定两个返回条件:

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 here
    if(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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值