今天分享一个LeetCode题,题号是1038,标题是:从二分搜索树到更大和数。

题目描述

给出二叉搜索树的根节点,该二叉树的节点值各不相同,修改二叉树,使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。

提醒一下,二叉搜索树满足下列约束条件:

1)节点的左子树仅包含键小于节点键的节点。

2)节点的右子树仅包含键大于节点键的节点。

3)左右子树也必须是二叉搜索树。

示例:

输入:[4, 1, 6, 0, 2, 5, 7, null, null, null, 3, null, null, null, 8]

输出:[30, 36, 21, 36, 35, 26, 15, null, null, null, 33, null, null, null, 8]

解题

光看题目描述,好像是看不到这题到底是什么意思,我反而是先看示例图就看懂了,你说气不气。

回归一下解题思路,这道题跟二分搜索树有关,之前也介绍过二分搜索树的遍历方式,如果需要回顾一下二分搜索数可以点击一下 传送 ,记得回城看题啊!

如果我们了解二分搜索树的中序遍历,求解这道题就变得非常容易。中序遍历是从左递归开始的,再进行访问这个节点,然后进行右递归,递归终止条件是这个节点为空。

看上面示例图,通过中序遍历可以得到有序数组:[0,1,2,3,4,5,6,7,8],如果左右递归调换的话也可以得到倒序。

求解这道题正是通过右递归 -> 访问节点 -> 左递归,得到每一个节点的和数。执行动画如下视频:

动画

动画视频地址:点击

进行右递归时,一直到该节点为空,直接返回和数,和数起始为0;返回上一个节点,将当前和数与节点的值相加为新的和数,并且该节点赋值为新的和数;然后进行左递归进行下一个节点。

我们可以先设定一个和数int sum = 0;,你可以把它放到全局变量,也可以把它放到局部变量。放到局部变量时可以把它作为参数贯穿所有的节点。代码如下:

Code
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode bstToGst(TreeNode root) {
if(root == null) return null;
int sum = 0;
bstToGstInt(root,sum);
return root;
} public int bstToGstInt(TreeNode node,int sum){
if(node == null) return sum;
sum = bstToGstInt(node.right,sum);
sum += node.val;
node.val = sum;
sum = bstToGstInt(node.left,sum);
return sum;
}
}

喜欢本文的朋友,欢迎关注公众号「算法无遗策」,收看更多精彩内容

LeetCode动画 | 1038. 从二叉搜索树到更大和树的更多相关文章

  1. 【JavaScript】Leetcode每日一题-二叉搜索树的范围和

    [JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...

  2. 【python】Leetcode每日一题-二叉搜索树节点最小距离

    [python]Leetcode每日一题-二叉搜索树节点最小距离 [题目描述] 给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 . 示例1: 输入:root = [4 ...

  3. 二叉搜索树的平衡--AVL树和树的旋转(图解)

    二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...

  4. 二叉搜索树的平衡--AVL树和树的旋转

    二叉搜索树只有保持平衡时其查找效率才会高. 要保持二叉搜索树的平衡不是一件易事.不过还是有一些非常经典的办法可以做到,其中最好的方法就是将二叉搜索树实现为AVL树. AVL树得名于它的发明者 G.M. ...

  5. [LeetCode] Split BST 分割二叉搜索树

    Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...

  6. Leetcode 96. 不同的二叉搜索树

    题目链接 https://leetcode.com/problems/unique-binary-search-trees/description/ 题目描述 给定一个整数 n,求以 1 ... n ...

  7. LeetCode.938-范围内求二叉搜索树节点值之和(Range Sum of BST)

    这是悦乐书的第359次更新,第386篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第221题(顺位题号是938).给定二叉搜索树的根节点,返回节点值在[L,R]之间的所有 ...

  8. [LeetCode]96. 不同的二叉搜索树(DP,卡特兰数)

    题目 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ ...

  9. LeetCode 95——不同的二叉搜索树 II

    1. 题目 2. 解答 以 \(1, 2, \cdots, n\) 构建二叉搜索树,其中,任意数字都可以作为根节点来构建二叉搜索树.当我们将某一个数字作为根节点后,其左边数据将构建为左子树,右边数据将 ...

随机推荐

  1. 2018-2-13-win10-uwp-异步进度条

    title author date CreateTime categories win10 uwp 异步进度条 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17 ...

  2. CodeChef Ada Pawns

    最小割 留下最多的点 形如左上或者右上没有点的点一定会留下 对于斜着的关系的两个点不能共存 黑白行染色! 白行的点称为 白点,黑点类似 反着连关系 对于一定会留下的,S到白点,黑点到T,都连inf 不 ...

  3. Mybatis 框架

    在之前的内容中,我写了Java的基础知识.Java Web的相关知识.有这些内容就可以编写各种各样丰富的程序.但是如果纯粹手写所有代码,工作量仍然很大.为了简化开发,隐藏一些不必要的细节,专心处理业务 ...

  4. Java 学习笔记(14)—— 文件操作

    java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...

  5. boostrap-非常好用但是容易让人忽略的地方【7】:list-unstyled list-inline

    无样式列表 list-unstyled:去掉ul的默认样式 内联列表 list-inline:将ul子元素放置于同一行

  6. HDU1166 敌兵布阵 BZOJ1012 最大数[树状数组]

    一.前置知识-树状数组 树状数组(binary indexed tree)是一种简洁的代码量很小的数据结构,能够高效的处理前缀区间上的问题.在很多情况下能写树状数组解决的就不用码半天线段树了. 树状数 ...

  7. 算法复杂度之 空间复杂度(Java)

    0.说明 根据算法书上的定义,一个算法的空间复杂度包括算法程序所占用的空间,输入初始数据所占用的空间以及算法执行过程中所需要的额外空间.本文各种结论全部参考过标准文献,本人也进行过验证.验证过程本文不 ...

  8. 使用app-inspector时报错connect ECONNREFUSED 127.0.0.1:8001的解决方案

    在使用 app-inspector -u udid时,报错如图所示 输入如下命令即可解决 npm config set proxy null 再次启动app-inspector即可成功

  9. form表单提交方式实现浏览器导出Excel

    刚开始使用ajax做Excel导出,发现ajax做不了浏览器导出只能下载到本地,于是用form提交可以提供浏览器下载Excel. 1>用ajax做本地下载: FileOutputStream f ...

  10. SpringDataJpa多条件查询代码封装

    package com.pantech.cloud.mlogistics.util; import com.mysql.jdbc.StringUtils; import org.springframe ...