首页 > 编程语言 >代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

代码随想录算法训练营第十七天| 110.平衡二叉树 257. 二叉树的所有路径 404.左叶子之和

时间:2024-02-14 16:33:17浏览次数:31  
标签:return int 随想录 404 二叉树 path root left

110.平衡二叉树 

题目链接:110. 平衡二叉树 - 力扣(LeetCode)

思路:判断平衡二叉树,就是判断两个子树的高度差,继而问题转化为了如何求子树的高度——后序遍历(主要卡在了这里)。递归函数返回的是树的高度,同时用-1来表示退出递归(一开始想着用bool型作为返回值,发现函数不好设计)。同时要关注递归函数的返回条件,不要忘了用abs函数和max函数简化代码。

class Solution {
public:
    int geth(TreeNode* root) {
        if (root == NULL)
            return 0;
        int lh = geth(root->left);
        int rh = geth(root->right);
        if (lh == -1) {
            return -1;
        }
        if (rh == -1) {
            return -1;
        }

        return abs(lh - rh) > 1 ? -1 : 1 + max(lh, rh);
    }
    bool isBalanced(TreeNode* root) {
        if (root == NULL)
            return true;
        return geth(root) == -1 ? false : true;
    }
};

257.二叉树的所有路径

题目链接:257. 二叉树的所有路径 - 力扣(LeetCode)

思路:困难在找到一条路径后如何进行回溯。解决方法是用path数组存储路径,在找到一条路径后输出path,并弹出一个元素,若没找到路径则进行递归。注意,string类型可以直接和int类型拼接,但int不会自动转化为char,因此要借助to_string()方法。

这里借助传递参数的引用来实现递归,并没有使用函数返回值。

class Solution {
public:
    void traversal(TreeNode *root,vector<string>&result,vector<int>&path){
        path.push_back(root->val);
        if(root->left==NULL&&root->right==NULL){
            string str;
            for(int i=0;i<path.size()-1;i++){
                str+=to_string(path[i]);
                str+="->";
            }
            str+=to_string(path[path.size()-1]);
            result.push_back(str);
            return;
        }
        if(root->left){
            traversal(root->left,result,path);
            path.pop_back();
        }
        if(root->right){
            traversal(root->right,result,path);
            path.pop_back();
        }
    }
    vector<string> binaryTreePaths(TreeNode* root) {
        vector<string> result;
        vector<int> path;
        if(root==NULL)return result;
        traversal(root,result,path);
        return result;
    }
};

404.左叶子之和 

题目链接:404. 左叶子之和 - 力扣(LeetCode)

思路:求所有左叶子节点的和。但是我们必须根据其父节点才能确认其是否为左叶子,故我们递归也只递归到左叶子的父节点。

同时我们把求整棵树的左叶子节点之和变为分别求左右子树左叶子节点之和再相加。

class Solution {
public:
    int sumOfLeftLeaves(TreeNode* root) {
           if(root==NULL)return 0;
           if(root->left==NULL&&root->right==NULL)return 0;
           int lc=sumOfLeftLeaves(root->left);
           if(root->left&&!root->left->left&&!root->left->right){
               lc+=root->left->val;
           }
           int rc=sumOfLeftLeaves(root->right);
           return lc+rc;
    }
};

 

标签:return,int,随想录,404,二叉树,path,root,left
From: https://www.cnblogs.com/Liubox/p/18015282

相关文章

  • docker 中安装apt-get install vim 失败,且apt-get update 报404
    在docker中安装vim时,安装失败。在更新apt-get时,报错如下:root@a8a94b78ebf0:/#apt-getupdateIgn:1http://deb.debian.org/debianstretchInReleaseIgn:2http://deb.debian.org/debianstretch-up......
  • 863. 二叉树中所有距离为 K 的结点
    首先要将二叉树转换成图,再用bfs做。1,二叉树转换成图用哈希表存当前节点和与其相连的点;通过当前节点于其父节点实现遍历;点击查看代码unordered_map<TreeNode*,vector<TreeNode*>>graph;voidcreateGraph(TreeNode*node,TreeNode*parent){if(!node)......
  • 1339. 分裂二叉树的最大乘积
    这道题关键突破点就是先算出节点总和,然后找到一颗子树总和最接近总和的一半。乘积最大基本就是先要求总和,然后找到最接近总和一半。关键就是这一步,找到最适合子树的和。点击查看代码if(abs(2*cur-sum)<abs(2*best-sum)){best=cur;}完整代码:点击查看......
  • 二叉树层次建树+遍历
    1.BiTree层次建树实现使用二叉树的链式存储,必须要构造一个辅助链式队列,用pcur遍历树结点,实现代码如下:代码实现//二叉树层次建树+画图2024-02-12#include<iostream>#include<cstdio>usingnamespacestd;//树结点的数据结构typedefcharElemType;typedefstructT......
  • 力扣 递归 迭代 栈 广度 队列 之 226. 翻转二叉树
    给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。 示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]栈/** *Definitionforabinarytreenode. *publicclassTreeNode......
  • 623 在二叉树中增加一行
    深度遍历,就是遍历:1.先要确定有几种情况,像这道题,深度为1,2就是最基本的情况,分为两种处理;2.根据不同情况,进行不同处理,不需要考虑后面递归的传递。3.确认传递的方式,如果函数返回的是指针,就需要left,right接住。完整代码:点击查看代码classSolution{public:TreeNode*ad......
  • 力扣递归 深度优先搜索 之 104. 二叉树的最大深度
    给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 示例1: 输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2/** *Definitionforabinarytreenode. *publicclassTre......
  • 力扣 145. 二叉树的后序遍历 递归 迭代
    递归/** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodelef......
  • 力扣 144. 二叉树的前序遍历 递归 迭代
    递归/** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval; *  TreeNodeleft; *  TreeNoderight; *  TreeNode(){} *  TreeNode(intval){this.val=val;} *  TreeNode(intval,TreeNodelef......
  • 力扣94. 二叉树的中序遍历 递归&迭代
    给定一个二叉树的根节点root,返回它的中序 遍历。 示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1] 递归/** *Definitionforabinarytreenode. *publicclassTreeNode{ *  intval;......