day17 | | 平衡二叉树,左叶子之和

12 篇文章 0 订阅

110.平衡二叉树

题目

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:

输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:

输入:root = []
输出: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:
  //左右中[返回-1表示已经不是平衡二叉树了,否则返回的是二叉树的高度]
   int getHight(TreeNode* node){
       if(node == nullptr) return 0; //到达叶子节点的左右孩子,返回高度为0
        int leftHigh = getHight(node->left);
        if(leftHigh == -1) return -1;
        int rightHigh = getHight(node ->right);
        if(rightHigh == -1) return -1;

        if(abs(leftHigh - rightHigh) > 1){
            return -1;
        }
        return 1 + max(leftHigh,rightHigh);
   }



    bool isBalanced(TreeNode* root) {
       //求高度,用后序遍历
       int result = getHight(root);
       if(result == -1) return false;
       return true;
    }
};

257.二叉树的所有路径

题目

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

示例 1:

输入:root = [1,2,3,null,5]
输出:[“1->2->5”,“1->3”]
示例 2:

输入:root = [1]
输出:[“1”]

题解

/**
 * 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:
   //这里的返回值为void,因为只用记录就好,其他路径不需要指定当前路径
    void traversal(TreeNode* node,vector<string> &result,vector<int> &path){
        path.push_back(node ->val); //写在递归终止之前,是因为最后一个节点也要加入路径
        //递归终止条件
        if(node->left == nullptr && node->right == nullptr){
            //开始加入路径
            string spath;
            for(int i = 0;i < path.size() - 1;i++){ //为了格式话输出,最后一个叶子节点在外面加入path
                spath += to_string(path[i]);
                spath += "->";
            }
            spath += to_string(path[path.size() - 1]);
            result.push_back(spath);
            return; //回溯
        }
       

        if(node -> left){
             traversal(node->left,result,path);
             path.pop_back();                              //递归完要进行回溯
        }
        if(node -> right){
            traversal(node->right,result,path);
             path.pop_back();     
        }
       
       

    }

    vector<string> binaryTreePaths(TreeNode* root) {
       //要从根节点 到 叶子节点的路径,所以用前序遍历
        vector<int> path;
        vector<string> result;
        traversal(root,result,path);

        return result;
         
    }
};

404.左叶子之和

题目

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

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: 24
解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:

输入: root = [1]
输出: 0

题解

/**
 * 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 sum = 0;
    int sumOfLeftLeaves(TreeNode* root) {
        //一个节点本身并不能判断是不是左叶子,要通过父节点来判断
        //父节点的左孩子不为空,且左孩子的左右孩子都为空时,父节点的左孩子为左叶子节点
        //直接遍历,判断每个节点是否为做叶子,是的话直接加和
        if(root == nullptr) return 0;
        //中
        if(root -> left != nullptr && !root->left->right && !root->left->left){
            sum += root->left->val;
        }
        //左
        sumOfLeftLeaves(root->left);
        //右
        sumOfLeftLeaves(root->right);
        
        return sum;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值