当前位置: 首页 > wzjs >正文

成立网站是不是需要先成立公司腾讯3大外包公司

成立网站是不是需要先成立公司,腾讯3大外包公司,建立网站的公司,新疆建设工程信息网为什么打不开Leetcode 538: 把二叉搜索树转换为累加树 是一道经典的树问题,考察的是二叉树的遍历、递归思想以及对二叉搜索树 (BST) 特性的理解。 题目描述 将给定的二叉搜索树 (BST) 转化成累加树 (Greater Tree),使得每个节点的值是原树中所有大于或等于该节点值的…

Leetcode 538: 把二叉搜索树转换为累加树 是一道经典的树问题,考察的是二叉树的遍历、递归思想以及对二叉搜索树 (BST) 特性的理解。


题目描述

将给定的二叉搜索树 (BST) 转化成累加树 (Greater Tree),使得每个节点的值是原树中所有大于或等于该节点值的节点值的和。


示例

输入

          4/   \1     6

输出

         10/  \16    6
  • 节点 10 = 节点值 4 + 6
  • 节点 16 = 节点值 1 + 4 + 6(包括自身,以及右子树所有节点等于或大于1的值)

解法一:反向中序遍历 + 累加器

(推荐解法:递归实现 + 累加变量)


思路
  1. 二叉搜索树的性质:
    • 对于任何一个节点,左子树的所有节点值均小于当前节点值,而右子树的所有节点值均大于当前节点值。
  2. 反向中序遍历:
    • 累加要求按从大到小的顺序遍历树,可以使用“右-根-左”(反中序遍历)。
    • 使用一个全局变量 sum 保存累加结果,在遍历过程中逐步更新每个节点的值。
  3. 流程:
    • 从右子节点开始遍历,逐步累加节点值,将计算结果赋值给根节点。
    • 然后继续遍历左子树。

代码模板
class Solution {private int sum = 0; // 累加器public TreeNode convertBST(TreeNode root) {if (root == null) {return null;}// 反向中序遍历convertBST(root.right);  // 遍历右子树sum += root.val;         // 累加root.val = sum;          // 更新当前节点值convertBST(root.left);   // 遍历左子树return root;}
}

复杂度分析
  • 时间复杂度: O(n)
    • 每个节点被访问一次,完成累加和赋值。
  • 空间复杂度: O(h)
    • 递归调用栈深度为树的高度 h,最坏情况下 h = n(链状树),平均情况下 h = log(n)(平衡树)。

适用场景
  • 此解法是 首选解法,递归逻辑简单,代码可读性强。
  • 适用于大部分二叉树,特别是递归深度不高的平衡二叉树。

解法二:迭代法(反向中序遍历 + 栈实现)

思路
  1. 递归虽然简单,但在深度较高时可能导致栈溢出问题,为避免递归调用,我们可以用 显式栈 实现反向中序遍历。
  2. 核心步骤:
    • 使用栈模拟递归过程,每次定位到最右子节点,然后从右到左依次计算累加值。
    • 使用 累加变量 sum 更新节点值。

代码模板
class Solution {public TreeNode convertBST(TreeNode root) {if (root == null) {return null;}Deque<TreeNode> stack = new ArrayDeque<>(); // 栈模拟递归TreeNode cur = root;int sum = 0;// 遍历while (cur != null || !stack.isEmpty()) {// 一直向右深入while (cur != null) {stack.push(cur);cur = cur.right;}// 处理栈顶节点cur = stack.pop();sum += cur.val;      // 累加并更新当前节点cur.val = sum;// 转向左子树cur = cur.left;}return root;}
}

复杂度分析
  • 时间复杂度: O(n)
    • 每个节点进栈出栈各一次。
  • 空间复杂度: O(h)
    • 显式栈的空间开销为树的高度 h

适用场景
  • 当树高度非常高时,此方法避免了递归的栈溢出问题。

解法三:Morris遍历(无需递归或栈,O(1)空间解法)

思路
  1. Morris 遍历是一种 利用树的特殊结构 实现中序遍历的空间优化方法。
  2. 核心思路:
    • 在每个节点的右子树中找到 “当前节点的前驱节点”,即比当前节点值小且最接近当前节点的节点。
    • 不使用栈,而是通过动态调整树结构(移动指针)进行遍历。
    • 在遍历过程中修改累加值并更新当前节点。

代码模板
class Solution {public TreeNode convertBST(TreeNode root) {TreeNode cur = root, pre;int sum = 0;while (cur != null) {// 当前节点的右子树不为空if (cur.right != null) {// 找到右子树中最左节点(即前驱)pre = cur.right;while (pre.left != null && pre.left != cur) {pre = pre.left;}// 建立连接if (pre.left == null) {pre.left = cur;cur = cur.right;} else { // 之前已建立连接,现在需要回退pre.left = null;  // 恢复树的正确结构sum += cur.val;cur.val = sum;cur = cur.left;}} else {// 没有右子树,直接处理当前节点,向左子树移动sum += cur.val;cur.val = sum;cur = cur.left;}}return root;}
}

复杂度分析
  • 时间复杂度: O(n)
    • 每个节点最多被访问两次(建立连接和断开连接)。
  • 空间复杂度: O(1)
    • 使用的是当前链表结构,没有额外的栈或递归调用。

适用场景
  • 当需要极限优化空间复杂度时(例如树非常大而内存有限)。

总结与比较

解法时间复杂度空间复杂度优点缺点
解法一:递归O(n)O(h)最简单、直观,适合递归逻辑树深度过大会导致栈溢出
解法二:迭代O(n)O(h)避免了递归,解决栈溢出问题增加了编码复杂度
解法三:Morris遍历O(n)O(1)不需递归或栈,空间复杂度最优修改树结构,逻辑较复杂

快速 AC 策略

  1. 推荐使用递归法(解法一)
    • 在面试时,能快速完成且符合常规逻辑。
    • 时间复杂度和空间复杂度效果都较好,且代码简洁。
  2. 递归较深,可能栈溢出时,用迭代法(解法二)
    • 能避免递归调用的缺陷。
    • 是递归的等价替代解法。
  3. Morris 遍历用于极限空间优化场景(解法三)
    • 当空间复杂度要求严格(如 O(1))时选择。
    • 但是编码和理解稍显困难。

熟练掌握这三种解法,能应对几乎所有类似问题!

http://www.dtcms.com/wzjs/523215.html

相关文章:

  • 软件开发去哪里学杭州百度快照优化公司
  • 武汉企业网站建设深圳全网推广方案
  • 计划网站搭建自动引流推广软件
  • 食品网站建设项目的预算互联网怎么打广告推广
  • 乐器产品主要在什么网站做推广清远新闻最新消息
  • 泰安市住房和城乡建设委员会网站免费网页制作模板
  • 有哪些网站是免费学做网页的七台河网站seo
  • 偃师做网站搜索引擎营销是什么
  • 网站建设的主要情况说明书上海快速排名优化
  • 哪个网站做平面能兼职网站制作和推广
  • 昆山企业网站建设公司windows优化软件哪个好
  • 西安中风险地区关键词排名seo
  • wordpress网站服务器谷歌浏览器直接打开
  • 响应式相册网站樱花bt引擎
  • 网站推广有哪些常用的方法百度搜索关键词排名查询
  • 网站公司怎么做推广方案佛山市人民政府门户网站
  • 政府部门建设网站的意义百度下载链接
  • 网站服务器租用4t多少钱一年啊知乎百度收录的网站多久更新一次
  • 装修案例英文seo推广软件
  • 坚持以高质量发展为首要任务一流程优化四个方法
  • wordpress的平台哪家网站优化公司好
  • 做图的网站福州网络营销推广公司
  • asp网站咋做关键词排名的工具
  • 社交网站建设流程网站查询系统
  • 品牌网站建站公司营销组合策略
  • 潍坊专业技术人员继续教育网站优化外包找谁
  • java网站开发视频下载网络运营与推广
  • app购物网站建设软文推广案例500字
  • 哪个素材网站比较好用江门搜狗网站推广优化
  • 河北建设厅网站刷身份证整站外包优化公司