day17 代码回想录 二叉树04 平衡二叉树&二叉树的所有路径&左叶子之和

大纲

● 110.平衡二叉树
● 257. 二叉树的所有路径
● 404.左叶子之和

平衡二叉树

题目链接:110.平衡二叉树
分析过程:
本题的解题思路是求最大深度和最短路径元素个数后,判断两者差是否小于1

// 二叉树是否平衡
void minMaxDepth(TreeNode* root, int count, int& min, int& max) {
    if (!root) {
        if (min > count) min = count;
        if (max < count) max = count;
        return;
    }

    count++;
    minMaxDepth(root->left, count, min, max);
    minMaxDepth(root->right, count, min, max);
    count--;
}


bool isBalanceTree(TreeNode* root)
{
    int min = INT_MAX;
    int max = INT_MIN;
    minMaxDepth(root, 0, min, max);

    if (max - min > 1) {
        return false;
    }
    return true;
}

二叉树的所有路径

题目链接: 257. 二叉树的所有路径
分析过程:
给定一个二叉树,返回所有从根节点到叶子节点的路径


// 所有的叶子节点
// 叶子节点:左右都为空的节点
// 使用回溯+递归法
// 递归参数:root [路径list] 返回值list
// 结束条件:root左右都为空
void getTreePath(TreeNode* root, vector<TreeNode*>& prePath, vector<string>& ret)
{
    // 节点为空结束
    if (!root) return;

    if (!root->left && !root->right) {
        string str;

        for (int i = 0; i < prePath.size(); ++i) {
            str.append(std::to_string(prePath[i]->val));
            str.append("->");
        }
        str.append(std::to_string(root->val));

        ret.push_back(str);
        return;
    }

    prePath.push_back(root);
    getTreePath(root->left, prePath, ret);
    getTreePath(root->right, prePath, ret);
    prePath.pop_back();
}

vector<string> getAllTreePath(TreeNode* root)
{
    vector<string> ret;

    if (!root) return ret;
    vector<TreeNode*> path;
    getTreePath(root, path, ret);

    return ret;
}

遇到问题:
1 忘记怎么把int 转string
2 忘记vector删除最后元素接口
3 没有想清楚递归结束条件,如果是root空怎么办,未处理

左叶子之和

题目链接:404.左叶子之和

// 左叶子之和
// 需要前一个节点 + 当前节点 如果当前节点的左右节点空 且 pre->left = cur
// 递归结束条件:root空 或者 是叶子节点
// 递归参数:root preNode, sum
void leftNodeSum(TreeNode* root, TreeNode* preNode, int& sum) {
    if (!root) return;
    // 是叶子节点
    if (preNode
            && !root->left
            && !root->right
            && preNode->left == root) {
        sum += root->val;
        return;
    }
    preNode = root;
    leftNodeSum(root->left, preNode, sum);
    leftNodeSum(root->right, preNode, sum);
}

int getLeftNodesSum(TreeNode* root) {
    int sum = 0;
    TreeNode* preNode = nullptr;
    leftNodeSum(root, preNode, sum);
    return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先,我们需要了解什么是扩展二叉树。扩展二叉树是一种二叉树的表示方法,其中每个非叶子节点都有两个子节点,但其中一个或两个子节点可以为空。因此,扩展二叉树的前序序列可以被表示为一个字符串,其中空节点用字符“#”表示。例如,扩展二叉树“1(2(4(#)(#))(5(#)(#)))”可以表示为前序序列“124##5##”。 现在我们来考虑如何构建二叉树。我们可以使用递归的方法来构建二叉树,每次递归都处理当前节点的子树和右子树。具体来说,我们可以先读取前序序列中的下一个字符,如果当前字符是“#”,则表示该节点为空;否则,我们可以将该字符转换为数字并创建一个新节点,然后递归构建该节点的子树和右子树。 下面是 Python 代码实现: ``` python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder): def helper(): val = preorder.pop(0) if val == '#': return None node = TreeNode(int(val)) node.left = helper() node.right = helper() return node return helper() ``` 接下来,我们需要计算给定二叉树的所有叶子之和叶子是指没有右子树的子树节点。因此,我们可以使用递归的方法遍历整个二叉树,在遍历的过程中累加所有叶子节点的值。具体来说,对于每个节点,我们将其子节点的值加入结果中,然后递归处理其子树和右子树。 下面是 Python 代码实现: ``` python def sumOfLeftLeaves(root): def helper(node, is_left): if not node: return 0 if not node.left and not node.right and is_left: return node.val return helper(node.left, True) + helper(node.right, False) return helper(root, False) ``` 完整代码如下: ``` python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder): def helper(): val = preorder.pop(0) if val == '#': return None node = TreeNode(int(val)) node.left = helper() node.right = helper() return node return helper() def sumOfLeftLeaves(root): def helper(node, is_left): if not node: return 0 if not node.left and not node.right and is_left: return node.val return helper(node.left, True) + helper(node.right, False) return helper(root, False) preorder = '1(2(4(#)(#))(5(#)(#)))' root = buildTree(list(preorder)) print(sumOfLeftLeaves(root)) # 输出 4 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

love_0_love

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值