【代码随想录37期】Day17 平衡二叉树、二叉树的所有路径、左叶子之和

26 篇文章 0 订阅
25 篇文章 0 订阅

平衡二叉树

int traversal(TreeNode* cur, int depth)
{
    if (!cur)
        return depth;
    int left_depth = traversal(cur->left, depth + 1);
    int right_depth = traversal(cur->right, depth + 1);
    if (left_depth == -1 || right_depth == -1)
        return -1;
    if (left_depth > right_depth + 1 || left_depth < right_depth - 1)
        return -1;
    return max(left_depth, right_depth);
}

bool isBalanced(TreeNode* root) {
    if (root == nullptr)
        return true;
    int result = traversal(root, 1);
    return result == -1 ? false : true;
}

二叉树的所有路径

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<string> ret;
void traversal(TreeNode* cur, string s)
{
    if (!cur->left && !cur->right)
    {
        ret.emplace_back(s);
        return;
    }
    string tmp = s;
    if (cur->left)
    {
        traversal(cur->left, s.append("->" + to_string(cur->left->val)));
    }
    s = tmp;
    if (cur->right)
    {
        traversal(cur->right, s.append("->" + to_string(cur->right->val)));
    }
         
    return;
}

vector<string> binaryTreePaths(TreeNode* root) {
    
    if (root == nullptr)
        return ret;
    string start = to_string(root->val);
    traversal(root, start);
    return ret;
}
};

左叶子之和

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ret;

void traversal(TreeNode* cur, bool isLeft)
{
    if (!cur)
        return;

    if (isLeft && !cur->left && !cur->right)
    {
        ret += cur->val;
        return;
    }
    
    traversal(cur->left, true);
    traversal(cur->right, false);
         
    return;
}

int sumOfLeftLeaves(TreeNode* root) {
    if (root == nullptr)
        return 0;

    traversal(root, false);
    return ret;
}
};
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值