力扣-Hot100-二叉树其一【算法学习day.32】

前言

###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴!!!


习题

1.二叉树的直径

题目链接: 543. 二叉树的直径 - 力扣(LeetCode)

题面:

**基本分析:**用recursion(i)表示i节点的最长子链长

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int ans = 0;
    public int diameterOfBinaryTree(TreeNode root) {
      recursion(root);
      return ans;
    }
    public int recursion(TreeNode root){
      if(root==null)return -1;
      int left = recursion(root.left)+1;
      int right = recursion(root.right)+1;
      ans = Math.max(ans,left+right);
      return Math.max(left,right);
    }
    
}

2.二叉树的层序遍历

题目链接: 102. 二叉树的层序遍历 - 力扣(LeetCode)

题面:

**基本分析:**使用队列实现bfs

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        Queue<TreeNode> queue = new ArrayDeque<>();
        Queue<TreeNode> queue2 = new ArrayDeque<>();
        if(root==null)return ans;
        int flag = 0;
        queue.offer(root);
        while(true){
        List<Integer> list = new ArrayList<>();
          if(flag%2==0){
          if(queue.isEmpty())break;
          while(!queue.isEmpty()){
          TreeNode node =  queue.poll();
          list.add(node.val);
          if(node.left!=null)queue2.offer(node.left);
          if(node.right!=null)queue2.offer(node.right);
         }
         }

         else{
          if(queue2.isEmpty())break;
          while(!queue2.isEmpty()){
          TreeNode node = queue2.poll();
          list.add(node.val);
           if(node.left!=null)queue.offer(node.left);
          if(node.right!=null)queue.offer(node.right);
        }
         }
         ans.add(list);
         flag++;
        }
        return ans;
    }
}

3.二叉搜索树中第K小的元素

题目链接: 230. 二叉搜索树中第 K 小的元素 - 力扣(LeetCode)

题面:

**基本分析:**中序遍历

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int[] arr = new int[10005];
    int count = 0;
    public int kthSmallest(TreeNode root, int k) {
        recursion(root);
        return arr[k-1];
    }
    public void recursion(TreeNode root){
       if(root==null)return;
       recursion(root.left);
       arr[count++] = root.val;
       recursion(root.right);
    }
}

4.二叉树的右视图

题目链接: 199. 二叉树的右视图 - 力扣(LeetCode)

题面:

**基本分析:**使用bfs存队列,每次结束后的队列头就是该层的最右边元素

代码:

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
     List<Integer> ans = new ArrayList<>();
    public List<Integer> rightSideView(TreeNode root) {
        if(root==null)return ans;
     Queue<TreeNode> queue = new ArrayDeque<>();
     Queue<TreeNode> queue2 = new ArrayDeque<>();
     queue.offer(root);
     int flag = 0;
     while(true){
        if(flag%2==0){
            if(queue.isEmpty())break;
          TreeNode right= queue.peek();
            ans.add(right.val);
            while(!queue.isEmpty()){
               TreeNode node =  queue.poll();
               if(node.right!=null)queue2.offer(node.right);
               if(node.left!=null)queue2.offer(node.left);
            }
        }else{
            if(queue2.isEmpty())break;
            TreeNode right= queue2.peek();
            ans.add(right.val);
            while(!queue2.isEmpty()){
               TreeNode node =  queue2.poll();
               if(node.right!=null)queue.offer(node.right);
               if(node.left!=null)queue.offer(node.left);
            }

        }
        flag++;
     }
     return ans;
    }
}

5.二叉树展开为链表

题目链接: 114. 二叉树展开为链表 - 力扣(LeetCode)

题面:

**吐槽:**这题被Java的引用闹麻了 ,贴上大佬代码

代码:

java 复制代码
class Solution {
    public void flatten(TreeNode root) {
        if(root == null){
            return ;
        }
        //将根节点的左子树变成链表
        flatten(root.left);
        //将根节点的右子树变成链表
        flatten(root.right);
        TreeNode temp = root.right;
        //把树的右边换成左边的链表
        root.right = root.left;
        //记得要将左边置空
        root.left = null;
        //找到树的最右边的节点
        while(root.right != null) root = root.right;
        //把右边的链表接到刚才树的最右边的节点
        root.right = temp;
    }
}

后言

上面是力扣Hot100的二叉树专题,下一篇是该专题的其他题目,希望有所帮助,一同进步,共勉!

相关推荐
trueEve1 分钟前
SQL,力扣题目1126,查询活跃业务
算法·leetcode·职场和发展
别开生面的阿杰5 分钟前
蓝桥杯-洛谷刷题-day3(C++)
c++·算法·蓝桥杯
有Li8 分钟前
稀疏视角CBCT重建的几何感知衰减学习|文献速递-基于深度学习的病灶分割与数据超分辨率
人工智能·深度学习·学习
她说人狗殊途17 分钟前
设计模式学习
java·学习·设计模式
Mr.W.T23 分钟前
JVM垃圾回收详解(重点)
java·jvm·算法
___Dream40 分钟前
算法闭关修炼百题计划(八)
算法
拒绝头秃从我做起1 小时前
1.两数之和-力扣(LeetCode)
leetcode
VertexGeek1 小时前
Rust学习(五):泛型、trait
前端·学习·rust
拔剑纵狂歌1 小时前
ZooKeeper单机、集群模式搭建教程
分布式·后端·学习·zookeeper·中间件·架构·服务发现
浮生如梦_2 小时前
Halcon 3D平面度
图像处理·算法·计算机视觉·平面·视觉检测