11.22二叉树相关OJ
创始人
2024-02-09 02:34:06
0

目录

一.每天学一个知识点

1.涉及公式

1.s.trim()

2.substring() 可以看出是满足一系列合法条件的时候,就会返回一个新的字符串.

1.思路1 栈

思路2:stringbulider

二,二叉树相关OJ题

1.检查两颗树是否相同

2.另一颗树的子树。

3.判断一颗二叉树是否是平衡二叉树

1.时间复杂度o(n^2)方法

2.时间复杂度为O(n)的做法

4.遍历二叉树建立

5.对称二叉树的判断


 

一.每天学一个知识点

8cb36a15620c402fa868d6b894508cb6.png

1.涉及公式

1.s.trim()

第一个循环找到开头的st下标.第二个循环找到结尾的.

01b09bbef04c45a79bcd697ea2a1ad49.png

2.substring() 可以看出是满足一系列合法条件的时候,就会返回一个新的字符串.

这里注意,from就是左臂右开的

27dc1a1ee1f7439ab564d0ab42a4a90a.png

s.substring s = s.trim() math.abs

1.思路1 栈

把元素从后往前压入栈中,如果遇到空格,就用sb接收弹出来的值,

如果遇到第一个元素且不是空格还要再次判断一次.

618de377fc754f21b9dabc84704bd6f3.png

思路2:stringbulider

d29f6a30466544a8b4459f070f812624.png

5e6642a8dd0c4a4ba7db72e5b521f91b.png

没有考虑最后一个单词的情况就算考虑到了,也不能处理两个单词间有空格的情况

a627d2287c144d7292e96f80e55e8eae.png

7fa8ccc6b9f54c2e85251352175a99aa.png

class Solution {public String reverseWords(String s) {s=s.trim();//删除首尾空格 是返回一个新的字符串StringBuilder sb=new StringBuilder();int j=s.length()-1;int i=j;while(i>=0){while(i>=0&&s.charAt(i)!=' ') i--;//找空格sb.append(s.substring(i+1,j+1)+' '); //拼接在一起加上空格while(i>=0&&s.charAt(i)==' ') i--;//跳过单词间的空格j=i;}return sb.toString().trim();//处理最后一个单词}
}

二,二叉树相关OJ题

1.检查两颗树是否相同

思路:不仅树节点结构相同也就是不能有一个为null有一个不为null.而且要求两个值要相同

b7d28da7444941d69e54ad3f38e1c9ad.png

 public boolean isSameTree(TreeNode p, TreeNode q) {if(p == null && q !=null ||p!=null&&q==null) return false;if(p==null&&q==null)return true;if(p.val==q.val) return true;//如果这样的话,假设两个相同,就没办法往下走了,就永远递归不了,直接返回true//必须要求都满足条件,再往下递归return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);}

此方法耦合度高且可读性差

class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {if(p!=null&&q!=null){if(p.val!=q.val){return false;}}else if(p==null&&q==null){return true;}else{return false;}boolean b= isSameTree(p.left,q.left);if(b){b=isSameTree(p.right,q.right);}return b;}
}

2.另一颗树的子树。

思路:要么就判断是否是相同的树,或者是他的左子树或者右子树是否相同,然后继续递归.

96496907ba7748a19428ade01c9b31e8.png

class Solution {public boolean isSameTree(TreeNode p, TreeNode q){if(p==null&&q!=null||p!=null&&q==null) return false;if(p==null&&q==null) return true;if(p.val!=q.val) return false;return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);}public boolean isSubtree(TreeNode root, TreeNode subRoot) {if(root==null) return false;if(isSameTree(root,subRoot)) return true;return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);}
}

3.判断一颗二叉树是否是平衡二叉树

c186ecea7cdf46e583b1d52017d1f924.png

1a2179478cf941a79f266edb52fed590.png

思路:如果是平衡二叉树那么每颗子树都是平衡二叉树,所以又要递归

1.时间复杂度o(n^2)方法

class Solution {public int treeHeight(TreeNode root){if(root==null) return 0;int heightLeft=treeHeight(root.left);int heightright=treeHeight(root.right);  return heightLeft>heightright?heightLeft+1:heightright+1;}public boolean isBalanced(TreeNode root) {if(root==null) return true;   int heightLeft=treeHeight(root.left);int heightright=treeHeight(root.right);if(heightLeft-heightright>1){return false;}if(heightright-heightLeft>1){return false;}//如果是true,总长度满足,剩下的分支就不会管了.就不会往下递归了//走到这一行要求左右差距不超过1return isBalanced(root.left)&&isBalanced(root.right);}
}

2.时间复杂度为O(n)的做法

因为在求树的高度的时候就已经把每个节点递归了

然后再平衡树的方法的时候又把每个节点再拿进去求所以复杂度就是n*n

class Solution {public int treeHeight(TreeNode root){if(root==null) return 0;int heightLeft=treeHeight(root.left);int heightright=treeHeight(root.right);if(heightLeft>=0&&heightright>=0&&Math.abs(heightLeft-heightright)<=1){return Math.max(heightLeft,heightright)+1;}else{return -1;}}public boolean isBalanced(TreeNode root) {if(root==null) return true;return treeHeight(root)>=0;}
}

4.遍历二叉树建立

9429da3636a84b84ab11262609f7916c.png

class TreeNode {TreeNode left;TreeNode right;char  val;TreeNode(char val) {this.val = val;}
}// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void inorder(TreeNode root){if(root==null) return;inorder(root.left);System.out.print(root.val+" ");inorder(root.right);}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseString str = in.nextLine();TreeNode root = createTree(str);inorder(root);System.out.println();i=0;}}public static int i=0;public static TreeNode createTree(String str) {char ch=str.charAt(i);TreeNode root=null;if(ch!='#'){root=new TreeNode(ch);i++;root.left=createTree(str);root.right=createTree(str);}else{i++;}return root;}}

5.对称二叉树的判断

也就是子树的左节点和另一棵树的右节点分别判断,也就是把判断两棵树是否相同改编一下就好

class Solution {public boolean issame(TreeNode p,TreeNode q){if(p!=null&&q==null) return false;if(p==null&&q!=null) return false;if(p==null&&q==null) return true;if(p.val!=q.val) return false;return issame(p.left,q.right)&&issame(p.right,q.left);}public boolean isSymmetric(TreeNode root) {if(root==null) return true;return issame(root.left,root.right);}
}

 

 

 

相关内容

热门资讯

经典悲伤的签名 经典悲伤的签名汇总60句  那温存的往事,曾一度让我思念的笑着流泪。下面是小编为大家整理推荐的悲伤的...
游戏id大全 游戏id大全  游戏id大全(精选500个)  每个玩游戏的玩游玩家都有自己的游戏id号,也就是我们...
时尚的QQ个性签名 时尚的QQ个性签名时尚的QQ个性签名1  峩心里旳 疼痛 又怎么用文字来写。  他的心早已变换了季节...
人生个性座右铭 关于人生个性座右铭(精选30句)  人生没有绝对的公平,而是相对公平。在一个天平上,你得到越多,势必...
最具创意的个性签名原创版 最具创意的个性签名原创版  随着社交网络和信息技术的飞速发展,越来越多人热衷于在网上设置自己的个性签...
牛的名字105个 牛的名字105个  一、网名的取名原则  1、符合形象定位要求  网名是你自己形象综合的,直接传达,...
好听的公司名字700例 好听的公司名字700例  名字的基本解释  人的称号。古人不仅有“名”,而且有“字”。婴儿出生三个月...
qq飞车好听的个性签名 qq飞车好听的个性签名70条  随着网络社交蓬勃发展,越来越多人习惯于时不时更换自己的个性签名,好的...
读书个性座右铭 关于读书个性座右铭汇总(通用80句)  书是我们时代的生命智慧里没有书籍,就好像鸟儿没有翅膀。以下是...
霸气网络签名摘抄 霸气网络签名摘抄(精选65句)  心仪和喜欢不一样,喜欢是切实的,真实存在的,而心仪是一种愿望,是幻...
英文个性签名设计免费 英文个性签名设计免费  英文个性签名设计A smile, a beautiful memories下...
女生的个性签名 女生的个性签名(精选290句)  随着社交网络的普及,越来越多人会在线上发布个性签名,好的个性签名对...
两个字的名字(精选1740个... 两个字的名字(精选1740个)  一、网名的取名原则  1、符合形象定位要求  网名是你自己形象综合...
简短霸气的励志个性签名 简短霸气的励志个性签名(精选220句)  随着社交网络的普遍使用,越来越多人会在线上发布个性签名,不...
少先队建队节讲座稿 少先队建队节讲座稿  演讲稿可以提高演讲人的自信心,有助发言人更好地展现自己。在快速变化和不断变革的...
女生超级伤感的个性签名 女生超级伤感的个性签名  1、我只是在寻觅,最初的天荒地老,什么时候才能变成现实。  2、从此没有谁...
成熟男人的微信名字昵称大全 成熟男人的微信名字昵称大全  成熟男人的微信名字昵称大全(精选450个)  如果说女性的容貌和身材是...
保险费率表 保险费率表汽车保险费率表摘要机动车辆保险基准费率表非营业用车车辆损失险1年以下1—2年2—6年6年以...
给女朋友的备注 给女朋友的备注  一、什么是备注  备注是一个汉语词语,一指表册上供填写附注的栏目;二指在备注栏内所...
商代盘龙城 商代盘龙城3500年前,今天的武汉市汉口城区是一片水乡泽国,在汉口北郊的傍水岗地上,有一座盘龙城。商...