首页 > 其他分享 >代码随想录Day17-Leetcode110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

代码随想录Day17-Leetcode110.平衡二叉树,257. 二叉树的所有路径,404.左叶子之和

时间:2023-04-01 16:35:33浏览次数:60  
标签:node result right return val 随想录 二叉树 257 left

110.平衡二叉树

题目链接:https://leetcode.cn/problems/balanced-binary-tree/
一个显然但似乎不太高效的方法是: 通过递归获取左右子树高度,判断差; 然后递归判断左右结点;
那么一个显然的改进就是后序遍历

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {boolean}
 */
 //一个显然但似乎不太高效的方法是: 通过递归获取左右子树高度,判断差; 然后递归判断左右结点;
//那么一个显然的改进就是后序遍历
var isBalanced = function(root) {
    let obj = {result:true}
    postOrder(root,obj)
    return obj.result
};

var postOrder = function(node,obj){
    if(node == null){
        return 0
    }
    let lHeight = postOrder(node.left,obj)
    let rHeight = postOrder(node.right,obj)
    if(Math.abs(lHeight-rHeight)>1){
        obj.result = false
    }
    return Math.max(lHeight,rHeight)+1
}

看了题解后,发现可以在不平衡时返回-1,不需要传一个类似全局的参数对象;

非递归暂时跳过

257. 二叉树的所有路径

回溯,已经比较熟练了;
但还是出现了:递归函数传参不全

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {string[]}
 */
 //显然的回溯
var binaryTreePaths = function(root) {
    let path = [] //用来存储临时"路径"
    let result = []//存储结果
    backtrack(root,path,result)
    return result
};

var backtrack = function(node, path,result){
    path.push(node.val)
    if(node.left==null&&node.right==null){
        result.push(path.join('->'))//若为叶子结点,则为一个有效结果
    }else{
        if(node.left){
            backtrack(node.left,path,result)
        }
        if(node.right){
            backtrack(node.right,path,result)
        }
    }
    path.pop()//遍历完子树,回溯为原来状态
}

看了题解,非递归用的好像是bfs,暂时略过

404. 左叶子之和

求和类的方法用自底向上很方便,所以用后序

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number}
 */
 //问题:我要如何知道一个叶子是左叶子;答:遍历时传入一个flag
//思路:更接近自底向上,所以用后序
var sumOfLeftLeaves = function(root) {
    return postOrder(root,false)
};

var postOrder = function(node,flag){
    let leftSum = 0  //左子树的"左和"
    let rightSum = 0 //右子树的"左和"
    if(!node.left&&!node.right){
        return flag?node.val:0//若为叶子结点,则根据flag返回值或0
    }else{
        if(node.left){
            leftSum = postOrder(node.left,true)
        }
        if(node.right){
            rightSum = postOrder(node.right,false)
        }
    }
    return leftSum+rightSum
}

看了题解,非递归还是层序遍历,暂时跳过

标签:node,result,right,return,val,随想录,二叉树,257,left
From: https://www.cnblogs.com/herbert118/p/17278810.html

相关文章

  • 代码随想录day 32● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II
    122.买卖股票的最佳时机II给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。示例1:输入:[7,1,5,3,6......
  • 二叉树中和为某一值的路径
    classSolution{public:vector<vector<int>>res;vector<int>path;voiddfs(TreeNode*root,intsum,intt){t+=root->val;path.push_back(root->val);if(root->left)dfs(root-&......
  • 数据结构之二叉树
    树是一种非线性数据结构,是由n(n>=0)个有限节点组成的一个具有层次关系的集合。树的逻辑结构看起来像一棵倒挂的树,根朝上,叶子朝下。树一般是递归定义的,每一棵树都可以认为是由根和其子树构成,且各个子树不相交。树树的相关概念节点的度:一个节点含有的子树的个数称为该节点的度;叶节......
  • LeetCode 94 二叉树的中序遍历
    LeetCode|94.二叉树的中序遍历给定一个二叉树的根节点root,返回它的中序 遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围[0,100]内-100<=Node.val<=100迭代实现:......
  • 代码随想录day 31 455.分发饼干 | 376. 摆动序列 | 53. 最大子序和
    455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干j,都有一个尺寸s[j] 。如果s[j] >=g[i],我们可以将这个饼干j分配给孩子i,这个孩......
  • 之子形打印二叉树
    classSolution{public:vector<vector<int>>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);intlevel=0;while(q.size()){intsize=q.size();......
  • 不分行从上往下打印二叉树
    classSolution{public:vector<int>res;voidbfs(TreeNode*root){queue<TreeNode*>q;q.push(root);while(q.size()){autop=q.front();q.pop();res.push_back(......
  • 上下翻转二叉树
    给定一个二叉树的根节点root,按照如下的方式上下翻转二叉树,并返回新的根节点。1、原来的左子节点变成新的根节点2、原来的根节点变成新的右子节点3、原来的右子节点变成新的左子节点上面的步骤都是逐层进行的,题目数据保证每个右节点都有一个同级节点(共享同一个父节点的左......
  • JZ7 重建二叉树
     JZ7 重建二叉树方法一:递归做法前序的第一个结点就是根节点,而后在中序中将根节点的位置找出,根节点的左边是左子树,右边是右子树,而后再带入前序中分析,形成迭代。/***Definitionforbinarytree*structTreeNode{*intval;*TreeNode*left;*Tree......
  • LeetCode 559.二叉树的最大深度
    1.题目:给定一个N叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。示例1:输入:root=[1,null,3,2,4,null,5,6]输出:3来源:力扣(LeetCode)链接:https://leetcode.cn/problems/maximum......