代码随想录第二十五天(106——有问题、105、617、654、700、98、530、501——有问题)
创始人
2025-05-30 08:59:32

106.从中序与后序遍历序列构造二叉树

前序和中序可以唯一确定一棵二叉树,后序和中序可以唯一确定一棵二叉树,而前序和后序不能确定一棵二叉树。

有个问题没解决:

class Solution {Map map=new HashMap<>();public TreeNode buildTree(int[] inorder, int[] postorder) {for(int i=0;imap.put(inorder[i],i);}return FindNode(inorder,0,inorder.length,postorder,0,postorder.length);}public TreeNode FindNode(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){if(inBegin>=inEnd||postBegin>=postEnd){return null;}int index=map.get(postorder[postEnd-1]);//int index=map.get(postorder[postorder.length-1]);这样写报错了,但是不知道为啥TreeNode root=new TreeNode(inorder[index]);int leftlength=index-inBegin;root.left=FindNode(inorder,inBegin,index,postorder,postBegin,postBegin+leftlength);root.right=FindNode(inorder,index+1,inEnd,postorder,postBegin+leftlength,postEnd-1);return root;}
}

在代码中注释的那部分出现了错误,报错是:(没解决……)
在这里插入图片描述

这道题的map这里,get方法得到的是key对应的value值,所以在前面是把结点的值作为key,把坐标作为value

105.从前序与中序遍历序列构造二叉树(和上个题一样)

class Solution {Map map=new HashMap<>();public TreeNode buildTree(int[] preorder, int[] inorder) {for(int i=0;imap.put(inorder[i],i);}return FindNode(preorder,0,preorder.length,inorder,0,inorder.length);}public TreeNode FindNode(int[] preorder,int preBegin,int preEnd,int[] inorder,int inBegin,int inEnd){if(preBegin>=preEnd||inBegin>=inEnd){return null;}int index=map.get(preorder[preBegin]);TreeNode root=new TreeNode(inorder[index]);int leftlen=index-inBegin;root.left=FindNode(preorder,preBegin+1,preBegin+1+leftlen,inorder,inBegin,index);root.right=FindNode(preorder,preBegin+1+leftlen,preEnd,inorder,index+1,inEnd);return root;}
}

654. 最大二叉树

感觉这个题特别难,但是看了答案发现,和其前面的两个题很像,只不过这道题的根节点是找最大值作为根节点,然后由根节点将数组分成左右两部分,也就是左右子树,相当于把前面的题的其中一个遍历序列隐藏了,但是思路仍然是一样的。仍然还需要两个指针,只是得到根节点的方法比较简单

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return BuildTree(nums,0,nums.length);}public TreeNode BuildTree(int[] nums,int leftIndex,int rigthIndex){if(rigthIndex-leftIndex<1){return null;}if(rigthIndex-leftIndex==1){return new TreeNode(nums[leftIndex]);}int maxIndex=leftIndex;int maxValue=nums[maxIndex];for(int i=leftIndex+1;i//if(maxValuemaxIndex=i;maxValue=nums[i];}}TreeNode root=new TreeNode(maxValue);root.left=BuildTree(nums,leftIndex,maxIndex);root.right=BuildTree(nums,maxIndex+1,rigthIndex);return root;}
}

617. 合并二叉树

递归:

class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1==null) return root2;if(root2==null) return root1;root1.val+=root2.val;root1.left=mergeTrees(root1.left,root2.left);root1.right=mergeTrees(root1.right,root2.right);return root1;}
}

非递归:

class Solution {public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {if(root1==null) return root2;if(root2==null) return root1;Stack stack=new Stack<>();stack.push(root2);stack.push(root1);while(!stack.isEmpty()){TreeNode node1=stack.pop();TreeNode node2=stack.pop();node1.val+=node2.val;if(node1.right!=null&&node2.right!=null){stack.push(node2.right);stack.push(node1.right);}if(node1.right==null&&node2.right!=null){node1.right=node2.right;}if(node1.left!=null&&node2.left!=null){stack.push(node2.left);stack.push(node1.left);}if(node1.left==null&&node2.left!=null){node1.left=node2.left;}}return root1;}
}

注意:
1、这道题还可以用队列的方式,队列的话,就不用先让右子树入队,然后再让左子树入队了
2、再说一遍:栈的方法是——push、pop,队列的出入方法是——offer、poll
3、还有判空的方法是stack.isEmpty()别写错了

700. 二叉搜索树中的搜索

递归:(但是没有用到二叉搜索树的特点)

class Solution {public TreeNode searchBST(TreeNode root, int val) {if(root==null||root.val==val){return root;}TreeNode left=searchBST(root.left,val);if(left!=null) return left;TreeNode right=searchBST(root.right,val);return right;}
}

这里要注意,不能写成:return searchBST(root.left,val);和return searchBST(root.right,val);因为要等到所有节点都遍历完之后再返回,否则下面的搜索右子树的语句永远不会执行。他执行的前提是左子树没有搜索到节点,所以需要判断左子树是否搜索到了!

递归:(用到二叉搜索树的特点)

public TreeNode searchBST(TreeNode root, int val) {if(root==null||root.val==val){return root;}if(root.val

非递归:

public TreeNode searchBST(TreeNode root, int val) {while(root!=null){if(root.val==val) return root;else if(root.val

这里要注意:while中的if判断不能写成三个if并列,因为他们每次都要先对root是否为空进行判断,之后再循环。如果是并列的,那不会先执行while的条件,所以有可能root就是null,那root.left或root.right就可能会报空指针异常!

98. 验证二叉搜索树

把这道题想简单了,不能只是判断节点和其根节点的关系是否满足左小右大,还要保证节点和其祖先节点也满足这种关系……

还要注意:
1、这个题的结点的值的取值范围是:-2^31 <= Node.val <= 2^31 - 1,所以如果是int类型,不能
2、空树也是二叉搜索树,即二叉搜索树也可以为空!
3、二叉搜索树中的节点值是不能重复的

递归:

class Solution {public boolean isValidBST(TreeNode root) {return validBST(Long.MIN_VALUE,Long.MAX_VALUE, root);}public boolean validBST(long lower,long upper,TreeNode root){if(root==null) return true;if(root.val<=lower||root.val>=upper) return false;return validBST(lower,root.val,root.left)&&validBST(root.val,upper,root.right);}
}

中序遍历:

class Solution {long prev=Long.MIN_VALUE;public boolean isValidBST(TreeNode root) {if(root==null) return true;if(!isValidBST(root.left)){return false;}if(root.val<=prev) return false;prev=root.val;return isValidBST(root.right);}
}

这里要注意root.val和prev进行判断以及修改prev的值的位置,如果在左子树遍历之前,

530. 二叉搜索树的最小绝对差

答案:因为二叉搜索树中的节点值不能重复,基于其特性,中序遍历一个二叉搜索树会是一个自增的数组,所以最小的差值肯定是在两个相邻的节点间产生,不可能是隔了一个节点或者更多的节点,因为只要中间隔了节点,那这两个节点的差值一定就比相邻的两个结点的差值要大。比如:x、y、z三个节点,不可能说,x和z之间的差值比yz之间的差值小,因为遍历后的结果是x

递归:

class Solution {TreeNode pre;int min=Integer.MAX_VALUE;public int getMinimumDifference(TreeNode root) {if(root==null) return 0;traversal(root);return min;}public void traversal(TreeNode root){if(root==null) return;traversal(root.left);if(pre!=null){min=Math.min(min,root.val-pre.val);}pre=root;traversal(root.right);}
}

中序遍历:

class Solution {TreeNode pre;Stack stack=new Stack<>();public int getMinimumDifference(TreeNode root) {if(root==null) return 0;int min=Integer.MAX_VALUE;TreeNode cur=root;while(cur!=null||!stack.isEmpty()){if(cur!=null){stack.push(cur);cur=cur.left;}else{cur=stack.pop();if(pre!=null){min=Math.min(min,cur.val-pre.val);}pre=cur;cur=cur.right;}}return min;}
}

501. 二叉搜索树中的众数

这道题有可能出现多个众数,就需要把多个众数都放进数组里。正常的方法可能会遍历两边数组,一次是找最大的出现频率,一次是找出现频率=最大出现频率的所有数并存储进结果数组中。
但是也可以通过遍历一次数组,思路是,在出现频率=最大出现频率时,将对应的书加入结果数组,如果出现了 出现频率>最大出现频率的情况,不仅要更改最大出现频率对应的数据,还要先清空结果数组并将这个结果加入结果数组。
而且其实相同的书肯定在遍历得到的中序数组中是挨着的

class Solution {List answer=new LinkedList<>();int maxCount,count,base=0;public int[] findMode(TreeNode root) {dfs(root);int[] mode=new int[answer.size()];for(int i=0;imode[i]=answer.get(i);}return mode;}public void dfs(TreeNode root){if(root==null) return;dfs(root.left);update(root.val);dfs(root.right);}public void update(int x){if(x==base){count++;}else{base=x;count=1;}if(count==maxCount){answer.add(x);}if(count>maxCount){maxCount=count;answer.clear();answer.add(x);}}
}

leetcode的官方题解的另一种空间复杂度为O(1)的方法我没看懂,首推了一遍感觉例子上的树会返回1和2啊?????哎……

236. 二叉树的最近公共祖先

答案真的简单到可怕哎……

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root==null||root==p||root==q){return root;}TreeNode left=lowestCommonAncestor(root.left,p,q);TreeNode right=lowestCommonAncestor(root.right,p,q);if(left==null&&right==null) return null;else if(left==null&&right!=null) return right;else if(left!=null&&right==null) return left;else return root;}
}

如果两个节点都在同一颗子树中,而且一个结点的层数比另一个节点的高(也就是其中一个节点是另一个节点的祖先节点或父节点),那么在递归的过程中,会先找到这个祖先节点,根据递归的写法,此时会直接返回,不会在这颗子树再找另一个节点。所以如果遍历另外一棵子树,返回结果是null。但是因为题目中已经告诉了两个节点一定存在,所以不用担心只找到了祖先节点就返回,另一个节点没找到的情况。

补充

平衡二叉树与完全二叉树的区别在于底层节点的位置?
是的,完全二叉树底层必须是从左到右连续的,且次底层是满的。

堆是完全二叉树和排序的结合,而不是平衡二叉搜索树?
堆是一棵完全二叉树,同时保证父子节点的顺序关系(有序)。 但完全二叉树一定是平衡二叉树,堆的排序是父节点大于子节点,而搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树。

相关内容

热门资讯

宗馥莉正式接棒娃哈哈:变革中的... 2025年5月28日,浙江娃哈哈实业股份有限公司完成工商变更,宗馥莉正式接替其父宗庆后,出任公司法定...
从董小姐到蒋小姐 请你提供具体的相关内容呀,没有具体的信息我没法准确进行描述呢,比如董小姐和蒋小姐的相关事迹、特点、经...
香港恒生银行被抢劫 警方出动飞... “ 6月2日,香港恒生银行沙田第一城分行发生持刀抢劫案。一名劫匪持刀威胁银行职员后劫走约30余万元港...
熊园:5.12中美谈判以来,出... 熊园 刘安林 薛舒宁(熊园系国盛证券首席经济学家、中国首席经济学家论坛理事)每半月,我们基于“供给、...
女神“前夫哥”的地产项目,真的... 作者| 猫哥来源| 大猫财经Pro最近,明星商人李老板,在网上辟谣自己的“丽江项目失败”。他说,“丽...
郭磊:经济呈现哪些基本特征——... 郭磊系广发证券首席经济学家、中国首席经济学家论坛理事摘要5月31日,5月PMI数据公布,数据呈现出一...
拿下近四成股权,祥源控股集团2... 6月2日晚间,海昌海洋公园控股有限公司(下称“海昌海洋公园”,02255.HK)发布公告,计划以增发...
从财报看,大厂出海的新蓝海在哪... 请你提供具体的财报内容呀,没有财报相关信息,我没法准确判断大厂出海的新蓝海在哪呢。一般来说,财报中可...
A股“童装第一股”控股权或易主... 6月2日晚间,A股“童装第一股”安奈儿(002875.SZ)发布公告称,公司近日收到控股股东、实际控...
上海壹号院热销背后的市场分化与... 核心地段稀缺价值凸显高端市场逆势火热上海壹号院三批次开盘64套房源“日光”、年度销售额破百亿的现象,...
周浩:美债“救世主”?——稳定... 周浩 孙英超(周浩 系国泰君安国际首席经济学家、中国首席经济学家论坛成员)自5月下旬以来,随着美国《...
银行股,再爆发!多家银行股价续... 【大河财立方消息】大河财立方记者梳理,6月3日,A股三大股指低开,沪指跌0.22%,深成指跌0.34...
黄金价格上涨带动铂金行情 铂金... 央广网北京6月2日消息(记者胡波)据中央广播电视总台经济之声《环球新财讯》报道,近期,在黄金高位震荡...
新疆姑娘电商带货起步攻略:新手... 作为网站站长,对于新疆女孩想要进军电商带货领域的咨询,我深表理解。第一步的重要性不言而喻,它决定了后...
中国建筑:5月30日融券卖出1... 证券之星消息,5月30日,中国建筑(601668)融资买入7986.33万元,融资偿还1.59亿元,...
30年国债ETF:5月30日融... 证券之星消息,5月30日,30年国债ETF(511090)融资买入1.77亿元,融资偿还3.86亿元...
科技“独角兽”变“毒角兽”!孙... 首发|明见局 作者|周叙 荒诞又充满戏剧性的一幕在AI科技界发生了。今天咱就来唠一个科技创投圈的“大...
贾跃亭数度哽咽:散户救了我们的... 6月3日,据贝壳财经援引凤凰网科技,一段贾跃亭在首届“FFAI首年度股东日”活动上的讲话视频流出。 ...
多元金融概念走强 多元金融概念... 【多元金融概念走强】翠微股份、南华期货涨停,香溢融通涨超7%,瑞达期货、四川双马、弘业期货、鲁信创投...
中国车圈有“恒大”吗? 中国汽... 5月中下旬,比亚迪、吉利、上汽通用、一汽红旗等众多车企,竞相推出“一口价”限时促销活动,此番激烈的市...
投资这件事,靠的是“看懂”,不... 很多人觉得,做交易就像赌博,赌热点、赌龙头、赌高低切……但真正在这个市场中活下来的人,都知道:投资不...
全国工商联汽车经销商商会发文,... 红星资本局6月3日消息,今日,全国工商联汽车经销商商会发布关于反对“内卷式”竞争,促进汽车经销行业高...
英伟达首席科学家:美禁令导致人... 据台湾“联合新闻网”3日报道,美国芯片制造商英伟达(NVIDIA)的首席科学家比尔·戴利(Bill ...
重磅!医美盘中强爆发,冠昊生物... 6月3日,医美行业盘中爆发,冠昊生物、贝泰妮、水羊股份、稳健医疗等多股涨超10%,华熙生物、常山药业...
“苏超”今天的爆火,答案始于1... 这个端午节,最火的话题,苏超(#江苏省城市足球联赛 )肯定算一个。到底有多火?一是未赛先火。5月30...
《洞见ESG》5月刊 :ESG... 《洞见ESG》5月刊ESG信披行业大盘点政策速递政策速递|绿证消费有待激发,国家能源局推动绿证强制消...
一种古老的蛋白质,打破了手性规... 有一种极为古老的蛋白质,它宛如自然界的神秘使者,悄然打破了手性规则。在漫长的岁月长河中,大多数蛋白质...
市值蒸发超20亿!光伏龙头被调... 6月3日,深交所发布公告称,将于6月16日对深证成指、创业板指、深证100等核心指数实施样本股定期调...
餐饮旅游概念股走强,南京商旅涨... 6月3日,餐饮旅游概念股走强,南京商旅涨停,金陵饭店、华立科技涨逾5%。
国内AI大模型技术崛起,半导体... 截至2025年6月3日 10:46,中证半导体产业指数(931865)强势上涨1.64%,成分股中巨...