• 【数据结构练习】二叉树相关oj题集锦二


    目录

    前言

    1.平衡二叉树

    2.对称二叉树

    3.二叉树遍历

    4.层序遍历

    5.判断一棵树是不是完全二叉树


    前言

    编程想要学的好,刷题少不了,我们不仅要多刷题,还要刷好题!为此我开启了一个弯道超车必做好题锦集的系列,此为二叉树面试题第二篇,每篇大约5题左右。该系列会不定期更新,敬请期待!


    1.平衡二叉树

    110. 平衡二叉树icon-default.png?t=N7T8https://leetcode.cn/problems/balanced-binary-tree/题目描述:

     

    方法一:自顶向下的递归 

    对于当前遍历到的节点,首先计算左右子树的高度,如果左右子树的高度差<= 1,再分别递归遍历左右子节点,并判断左子树和右子树是否平衡。这是一个自顶向下的递归的过程。

    步骤: 

     

    利用递归思想进行逐个遍历,时间复杂度较高,为O(N^2)

    代码:

    1. class Solution {
    2. public int maxDepth(TreeNode root) {
    3. if (root == null) {
    4. return 0;
    5. }
    6. int leftHeight = maxDepth(root.left);
    7. int rightHeight = maxDepth(root.right);
    8. return (leftHeight > rightHeight) ?
    9. (leftHeight + 1) : (rightHeight + 1);
    10. }
    11. public boolean isBalanced(TreeNode root) {
    12. if (root == null) {
    13. return true;
    14. }
    15. int hleft=maxDepth(root.left);
    16. int hright=maxDepth(root.right);
    17. return Math.abs(hleft-hright)<=1&&
    18. isBalanced(root.left)&&isBalanced(root.right);
    19. }
    20. }

    方法二:自底向上的递归

    对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回 −1。如果存在一棵子树不平衡,则整个二叉树一定不平衡。

    代码:

    1. class Solution {
    2. public int maxDepth2(TreeNode root) {
    3. if (root == null) {
    4. return 0;
    5. }
    6. int leftHeight = maxDepth2(root.left);
    7. if (leftHeight < 0) {
    8. return -1;
    9. }
    10. int rightHeight = maxDepth2(root.right);
    11. if(leftHeight>=0&&rightHeight>=0&&
    12. Math.abs(leftHeight-rightHeight)<=1){
    13. return Math.max(leftHeight, rightHeight) + 1;
    14. }else {
    15. return -1;
    16. }
    17. }
    18. public boolean isBalanced(TreeNode root) {
    19. return maxDepth2(root)>=0;
    20. }
    21. }

    2.对称二叉树

    对称二叉树icon-default.png?t=N7T8https://leetcode.cn/problems/symmetric-tree/题目描述:

    方法:递归 

    (1)如果一个树是空树,这个树是对称的。

    (2)如果一个非空树的左子树与右子树完全相同,那么这个树是对称的。

    代码:

    1. class Solution {
    2. public boolean issymmetric(TreeNode l,TreeNode r) {
    3. if(l != null&&r == null || l == null && r != null) {
    4. return false;
    5. }
    6. if(l == null && r == null ) {
    7. return true;
    8. }
    9. if(l.val != r.val ) {
    10. return false;
    11. }
    12. return issymmetric(l.left,r.right) && issymmetric(l.right,r.left);
    13. }
    14. public boolean isSymmetric(TreeNode root) {
    15. if(root==null){
    16. return true;
    17. }
    18. return issymmetric(root.left,root.right);
    19. }
    20. }

    3.二叉树遍历

    思路: 

    代码:

    1. import java.util.Scanner;
    2. class TreeNode1{
    3. public char val;
    4. public TreeNode1 left;
    5. public TreeNode1 right;
    6. public TreeNode1(char val) {
    7. this.val = val;
    8. }
    9. }
    10. public class Main {
    11. public static int i = 0;
    12. public static TreeNode1 createTree(String str){
    13. TreeNode1 root = null;
    14. if (str.charAt(i) != '#') {
    15. root = new TreeNode1(str.charAt(i));
    16. i++;
    17. root.left = createTree(str);
    18. root.right = createTree(str);
    19. } else {
    20. i++;
    21. }
    22. return root;
    23. }
    24. public static void inOrderTraversal(TreeNode1 root){
    25. if (root == null) {
    26. return;
    27. }
    28. inOrderTraversal(root.left);
    29. System.out.print(root.val+" ");
    30. inOrderTraversal(root.right);
    31. }
    32. public static void main(String[] args) {
    33. Scanner scan = new Scanner(System.in);
    34. while (scan.hasNextLine()) {
    35. String str = scan.nextLine();
    36. TreeNode1 root = createTree(str);
    37. inOrderTraversal(root);
    38. }
    39. }
    40. }

     


    4.层序遍历

    何为层序遍历?

    设二叉树的根节点所在 层数为1 ,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第 2 层 上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

    102. 二叉树的层序遍历icon-default.png?t=N7T8https://leetcode.cn/problems/binary-tree-level-order-traversal/

    题目描述:

    解析:

    在遍历每一行的节点队列时,将该行每个节点的非空子节点添加到队列中,直到遍历到最后一行时,没有子节点再入队列,结束循环。 

    代码:

    1. class Solution {
    2. public List> levelOrder(TreeNode root) {
    3. List> lists = new ArrayList<>();
    4. if(root==null){
    5. return lists;
    6. }
    7. Queue queue=new LinkedList<>();
    8. queue.offer(root);
    9. while(!queue.isEmpty()){
    10. ArrayList tmp = new ArrayList<>();
    11. int size=queue.size();
    12. while (size>0){
    13. TreeNode cur=queue.poll();
    14. tmp.add(cur.val);
    15. size--;
    16. if(cur.left!=null){
    17. queue.add(cur.left);
    18. }
    19. if(cur.right!=null){
    20. queue.add(cur.right);
    21. }
    22. }
    23. lists.add(tmp);
    24. }
    25. return lists;
    26. }
    27. }

    5.判断一棵树是不是完全二叉树

    解析:

    定义一个队列,先将根结点入队,如果队列不为空我们就进入循环,将队列的元素进行出栈并赋给cur变量,如果cur不等于null,我们就将cur的左树和右树进行入队,如果cur为null则跳出循环,这时候我可以将队列进行出队,元素全部为null,则为完全二叉树。

     

    代码:

    1. public boolean isCompleteTree(TreeNode root){
    2. if(root == null) {
    3. return true;
    4. }
    5. Queue queue = new LinkedList<>();
    6. queue.offer(root);
    7. while (queue.isEmpty()){
    8. TreeNode cur=queue.poll();
    9. if(cur!=null){
    10. queue.offer(cur.left);
    11. queue.offer(cur.right);
    12. }else{
    13. break;
    14. }
    15. }
    16. while (!queue.isEmpty()) {
    17. TreeNode tmp = queue.poll();
    18. if(tmp != null) {
    19. return false;
    20. }
    21. }
    22. return true;
    23. }

     


    以上为我个人的小分享,如有问题,欢迎讨论!!! 

    都看到这了,不如关注一下,给个免费的赞 

     

  • 相关阅读:
    [ 复习 ] - TypeScript 基础类型
    单端口RAM实现FIFO
    超级实用的程序员接单平台,看完少走几年弯路,强推第一个!
    【Kubernetes】k8s集群资源调度
    应用统计专业学习指南
    flink sql 使用自定义的mysql source分片读取
    ​面试经典150题——LRU 缓存
    人像分割技术解析与应用
    windows11恢复ie浏览器的方法教程
    mysql 远程连接数据库的两种修改方法
  • 原文地址:https://blog.csdn.net/WHabc2002/article/details/133434052