11.22二叉树相关OJ
创始人
2024-02-09 14:39:28
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);}
}

 

 

 

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...