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

力扣二叉树--第三十四天

前言

今天是构建二叉树和处理两个二叉树的问题。重点:单调栈的思想,后续模块会专门刷题。

内容

一、最大二叉树

654. 最大二叉树

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树 

递归
func constructMaximumBinaryTree(nums []int) *TreeNode {
     if len(nums)==0{
         return nil
     }
    index:=findMax(nums)
   root:=&TreeNode{
       Val:nums[index],
       Left:constructMaximumBinaryTree(nums[:index]),
       Right:constructMaximumBinaryTree(nums[index+1:]),
   }//三个逗号
   return root
}

func findMax(nums []int)int{
    index:=0
    for i,v:=range nums{
    if nums[index]<v{
        index=i
    }
    }
    return index
}
单调栈

解决类似于“下一个更大元素”的问题时非常好用

单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈单调递减栈

单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小

单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大

维持一个单调递增的栈:

当节点值大于栈顶时,弹出栈顶作为当前节点的左孩子

栈顶的右孩子就是当前节点

当前节点加入栈

func constructMaximumBinaryTree(nums []int)*TreeNode{
   stack:=[]*TreeNode{}
   for _,num:=range nums{
       cur:=&TreeNode{num,nil,nil}
       for len(stack)>0&&stack[len(stack)-1].Val<num{
           cur.Left=stack[len(stack)-1]
           stack=stack[:len(stack)-1]
       }
       if len(stack)>0{
           stack[len(stack)-1].Right=cur
       }
       stack=append(stack,cur)
   }
   return stack[0]
}
//同一个节点的左右子树会被多次赋值
二、合并二叉树

617. 合并二叉树

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

深度优先搜索
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
  if root1==nil{
      return root2
  }
  if root2==nil{
      return root1
  }//修改root1 or 新建一个树
    // root1.Val+=root2.Val
    // root1.Left=mergeTrees(root1.Left,root2.Left)
    // root1.Right=mergeTrees(root1.Right,root2.Right)
    // return root1     
    root:=&TreeNode{
        Val:root1.Val+root2.Val,
        Left:mergeTrees(root1.Left,root2.Left),
        Right:mergeTrees(root1.Right,root2.Right),
    }
    return root
}

最后

坚持!


http://www.kler.cn/news/148214.html

相关文章:

  • 你真的懂人工智能吗?AI真的只是能陪你聊天而已吗?
  • MySQL的Redo Log跟Binlog
  • C#,《小白学程序》第二十七课:大数四则运算之“运算符重载”的算法及源程序
  • 智慧城市交通大屏|助力解决城市交通问题
  • HarmonyOS 位置服务开发指南
  • 福州大学《嵌入式系统综合设计》 实验八:FFMPEG视频编码
  • C++: String类接口学习
  • FFmpeg 使用
  • Flask Web开发实验一:第一个Flask项目与Flask的工作方式
  • 2021年12月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 用苹果签名免费获取Xcode
  • [Spring] 字节一面~Spring 如何解决循环依赖问题 以及 @resource 与 @autowire 同时存在时谁生效
  • ES8语法async与await
  • xxljob学习笔记01(小滴课堂)
  • Kotlin中常见的List使用
  • Vue简单的表单操作
  • php.ini文件中XDebug的配置
  • python回溯求解电话号码组合
  • PHP 双门双向门禁控制板实时监控源码
  • mysql命令行连接数据库
  • 【数据结构】C : 追星
  • 进入docker容器
  • 【Web】PHP反序列化刷题记录
  • React入门使用 (官方文档向 Part1)
  • 体验一下压行的快乐~
  • python的itertools库
  • react的开发中关于图片的知识
  • [CLickhouse] 学习小计
  • 人工智能应用:文本分类的技术突破与实战指导
  • 学术科研常用工具