• 11.22二叉树相关OJ


    目录

    一.每天学一个知识点

    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

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

    二,二叉树相关OJ

    1.检查两颗树是否相同

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

    b7d28da7444941d69e54ad3f38e1c9ad.png

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

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

    1. class Solution {
    2. public boolean isSameTree(TreeNode p, TreeNode q) {
    3. if(p!=null&&q!=null){
    4. if(p.val!=q.val){
    5. return false;
    6. }
    7. }else if(p==null&&q==null){
    8. return true;
    9. }else{
    10. return false;
    11. }
    12. boolean b= isSameTree(p.left,q.left);
    13. if(b){
    14. b=isSameTree(p.right,q.right);
    15. }
    16. return b;
    17. }
    18. }

    2.另一颗树的子树。

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

    96496907ba7748a19428ade01c9b31e8.png

    1. class Solution {
    2. public boolean isSameTree(TreeNode p, TreeNode q){
    3. if(p==null&&q!=null||p!=null&&q==null) return false;
    4. if(p==null&&q==null) return true;
    5. if(p.val!=q.val) return false;
    6. return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
    7. }
    8. public boolean isSubtree(TreeNode root, TreeNode subRoot) {
    9. if(root==null) return false;
    10. if(isSameTree(root,subRoot)) return true;
    11. return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);
    12. }
    13. }

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

    c186ecea7cdf46e583b1d52017d1f924.png

    1a2179478cf941a79f266edb52fed590.png

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

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

    1. class Solution {
    2. public int treeHeight(TreeNode root){
    3. if(root==null) return 0;
    4. int heightLeft=treeHeight(root.left);
    5. int heightright=treeHeight(root.right);
    6. return heightLeft>heightright?heightLeft+1:heightright+1;
    7. }
    8. public boolean isBalanced(TreeNode root) {
    9. if(root==null) return true;
    10. int heightLeft=treeHeight(root.left);
    11. int heightright=treeHeight(root.right);
    12. if(heightLeft-heightright>1){
    13. return false;
    14. }
    15. if(heightright-heightLeft>1){
    16. return false;
    17. }//如果是true,总长度满足,剩下的分支就不会管了.就不会往下递归了
    18. //走到这一行要求左右差距不超过1
    19. return isBalanced(root.left)&&isBalanced(root.right);
    20. }
    21. }

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

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

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

    1. class Solution {
    2. public int treeHeight(TreeNode root){
    3. if(root==null) return 0;
    4. int heightLeft=treeHeight(root.left);
    5. int heightright=treeHeight(root.right);
    6. if(heightLeft>=0&&heightright>=0&&Math.abs(heightLeft-heightright)<=1){
    7. return Math.max(heightLeft,heightright)+1;
    8. }else{
    9. return -1;
    10. }
    11. }
    12. public boolean isBalanced(TreeNode root) {
    13. if(root==null) return true;
    14. return treeHeight(root)>=0;
    15. }
    16. }

    4.遍历二叉树建立

    9429da3636a84b84ab11262609f7916c.png

    1. class TreeNode {
    2. TreeNode left;
    3. TreeNode right;
    4. char val;
    5. TreeNode(char val) {
    6. this.val = val;
    7. }
    8. }
    9. // 注意类名必须为 Main, 不要有任何 package xxx 信息
    10. public class Main {
    11. public static void inorder(TreeNode root){
    12. if(root==null) return;
    13. inorder(root.left);
    14. System.out.print(root.val+" ");
    15. inorder(root.right);
    16. }
    17. public static void main(String[] args) {
    18. Scanner in = new Scanner(System.in);
    19. // 注意 hasNext 和 hasNextLine 的区别
    20. while (in.hasNextLine()) { // 注意 while 处理多个 case
    21. String str = in.nextLine();
    22. TreeNode root = createTree(str);
    23. inorder(root);
    24. System.out.println();
    25. i=0;
    26. }
    27. }
    28. public static int i=0;
    29. public static TreeNode createTree(String str) {
    30. char ch=str.charAt(i);
    31. TreeNode root=null;
    32. if(ch!='#'){
    33. root=new TreeNode(ch);
    34. i++;
    35. root.left=createTree(str);
    36. root.right=createTree(str);
    37. }else{
    38. i++;
    39. }
    40. return root;
    41. }
    42. }

    5.对称二叉树的判断

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

    1. class Solution {
    2. public boolean issame(TreeNode p,TreeNode q){
    3. if(p!=null&&q==null) return false;
    4. if(p==null&&q!=null) return false;
    5. if(p==null&&q==null) return true;
    6. if(p.val!=q.val) return false;
    7. return issame(p.left,q.right)&&issame(p.right,q.left);
    8. }
    9. public boolean isSymmetric(TreeNode root) {
    10. if(root==null) return true;
    11. return issame(root.left,root.right);
    12. }
    13. }

     

     

     

  • 相关阅读:
    网络协议分析-http/https/tcp/udp
    自动化测试,5个技巧轻松搞定
    毛玻璃用户卡交互
    mac tableau 安装mysql驱动
    应对出海安全合规挑战,兆珑科技为什么选择了亚马逊云科技?
    2022.07.20 NDK OpenGL ES 3.0 :画个三角形,纹理贴图(刚入门就入土)
    springboot+旅游网站 毕业设计-附源码211713
    RabbitMQ(原理,下载,安装)
    【编译原理】手工打造词法分析器
    x264的参考帧管理机制
  • 原文地址:https://blog.csdn.net/m0_72618437/article/details/127992466