栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

404. 左叶子之和、513. 找树左下角的值

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

404. 左叶子之和、513. 找树左下角的值

404. 左叶子之和

题目描述:给定二叉树的根节点 root ,返回所有左叶子之和。

解答:

法一:迭代法(层序遍历)

看到本题首先思考的是,如何确定是左叶子?叶子很好确定,左右子节点均为空即可,但是左叶子应该如何确定?

经过观察,如果将空节点也当作一个存在的节点,每一层的左节点在该层中序号数为2的倍数(0,2,4,8......)。

因此可以采用层序遍历,将空节点也入队,视为一个节点,但是不进行处理,仅用于计数。遇到左右子节点均为空且对2求余为0的节点(即为左叶子)求和即可。

代码实现:

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        queueque;
        int sum = 0;
        //只有一个节点的树额外处理
        if (root->left == NULL && root->right == NULL) return sum;
        que.push(root);
        while(!que.empty()){
            int size = que.size();
            for (int i = 0; ileft == NULL && p->right == NULL && i%2 == 0)
                        sum += p->val;
                    que.push(p->left);
                    que.push(p->right);
                }
            }
        }
        return sum;
    }
};

法二:递归实现

其实确定一个节点是左叶子主要得看他得父节点,单看他是看不出来的,必须要通过节点的父节点来判断其左孩子是不是左叶子

如果该节点的左节点不为空,该节点的左节点的左节点为空,该节点的左节点的右节点为空,则找到了一个左叶子,判断代码如下:

if (node->left != NULL && node->left->left == NULL && node->left->right == NULL) {
    左叶子节点处理逻辑
}

依然还是考虑递归三部曲:

(1)参数和返回值: 判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int

(2)终止条件:if(node == NULL)return 0;

(3)内部处理逻辑: 当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和、右子树左叶子之和,相加便是整个树的左叶子之和。

代码实现:

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
        if(root == NULL) return 0;
        int leftValue = sumOfLeftLeaves(root->left);    // 左
        int rightValue = sumOfLeftLeaves(root->right);  // 右
        // 中
        int midValue = 0;
        if (root->left && !root->left->left && !root->left->right)
            midValue = root->left->val;
        int sum = midValue + leftValue + rightValue;
        return sum;
    }
};

513. 找树左下角的值

题目描述:

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。

假设二叉树中至少有一个节点。

解答:

法一:迭代法(层序遍历)

层序遍历解决这个属实简单,直接层序遍历至最底层,返回最底层的第一个值即可。

代码实现:

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        queueque;
        que.push(root);
        int num = 0;
        while(!que.empty()){
            int size = que.size();
            for (int i = 0; ival;
                que.pop();
                if (p->left) que.push(p->left);
                if (p->right) que.push(p->right);
            }
        }
        return num;
    }
};

法二:递归法 

最底层的左下角节点,如何找到最底层?和二叉树的深度类似,先找最大深度,再找左边节点。

那么如何找最左边的呢?可以使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。

递归三要素:

(1)参数和返回值:根节点用于遍历,再用一个参数记录深度,无需返回值(关于是否需要返回值见下一篇博客:路径总和)

(2)终止条件:当遇到叶子节点的时候,更新一下最大的深度。

(3)内部处理逻辑:在找最大深度的时候,递归的过程中依然要使用回溯

代码实现:

class Solution {
public:
    int maxLen = INT_MIN;
    int maxleftValue;
    void traversal(TreeNode* root, int leftLen) {
        if (root->left == NULL && root->right == NULL) {
            if (leftLen > maxLen) {
                maxLen = leftLen;
                maxleftValue = root->val;
            }
            return;
        }
        if (root->left) {
            leftLen++;
            traversal(root->left, leftLen);
            leftLen--; // 回溯
        }
        if (root->right) {
            leftLen++;
            traversal(root->right, leftLen);
            leftLen--; // 回溯
        }
        return;
    }
    int findBottomLeftValue(TreeNode* root) {
        traversal(root, 0);
        return maxleftValue;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/867316.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号