数据结构------二叉树经典习题1

博主主页: 码农派大星.

关注博主带你了解更多数据结构知识

1判断相同的树 OJ链接


 这道题相对简单,运用我们常规的递归写法就能轻松写出

所以我们解题思路应该这样想:

1.如果p为空,q为空,那么就是两颗空树肯定相等
2.如果一个树为空另一棵树不为空那么一定不相等
3.如果都不为空,值相同才相等。
4.再递归判断左子树是否相等,右子树是否相等,只有左右子树都相等才是相同的树

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        //1,一个为空一个不为空
        if(p != null && q == null || p == null  && q != null){
            return false;
        }
        //2,第一步走完要么都为空 要么都不为空 两个都是空
        if(p == null && q== null){
            return true;
        }
        //3,都不为空
        if(p.val != q.val){
            return false;
        }
        //4,此时代表两个都不为空,同时val也是一样
        //5,说明根节点相同,接下来判断两棵树的左 右是不是同时相同
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);

    }
}

2判断另一课树的子树OJ链接

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。

这道题也要用到我们的递归思想

1如果都为空树,则false

2如果俩个树为相同的树,则true

3 再递归看sub是否为左子树的子树,右子树的子树,如果都不是,则返回false

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root == null){
            return false;
        }
        //1,判断两个树是不是相同的树
        if(isSameTree(root,subRoot)){
            return true;
        }
        //2,
        if(isSubtree(root.left,subRoot)){
            return true;
        }
         if(isSubtree(root.right,subRoot)){
            return true;
        }
        return false;   
   }
         public boolean isSameTree(TreeNode p, TreeNode q) {
        //1,一个为空一个不为空
        if(p != null && q == null || p == null  && q != null){
            return false;
        }
        //2,第一步走完要么都为空 要么都不为空 两个都是空
        if(p == null && q== null){
            return true;
        }
        //3,都不为空
        if(p.val != q.val){
            return false;
        }
        //4,此时代表两个都不为空,同时val也是一样
        //5,说明根节点相同,接下来判断两棵树的左 右是不是同时相同
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);

    }

}

 

3翻转二叉树OJ链接 

同样的递归思想,不变的套路

1判断是否为空树

2再用递归交换左右树 

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root == null){
            return null;
        }
        TreeNode tmp = root.left;
        root.left = root.right;
        root.right = tmp;
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

4平衡二叉树OJ链接

 

1判断是否空树

2求左树的深度和右树的深度

3判断左树的深度减右树的深度不能大于1

左树和右数的子树也一样

math.abs() 是一个数学函数,它用于返回一个数的绝对值 

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
         return getHeight(root) >= 1;
    }
    //获取二叉树高度
    public int getHeight(TreeNode root){
        if(root == null){
            return 0;
        }
         int leftHeight = getHeight(root.left);
         if(leftHeight < 0){
            return -1;
         }
        int rightHeight = getHeight(root.right);
        if(rightHeight < 0){
            return -1;
        }
        if(Math.abs(leftHeight - rightHeight) <= 1){
            return Math.max(leftHeight,rightHeight) + 1;
       }else{
            return -1;
        }
    }
}

5对称二叉树 OJ链接

 

1判断是否根节点为空

2 检查结构是否相同:一个为空一个不为空

3检查结构:两个都为空或两个都不为空

4判断左右根节点是否相同

5开始判断是否对称 递归开始:

满足左子树的左  和 右子树的右  对称 同时 左子树的右  和 右子树的左 对称

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null) return true;
        return isSymmetricChild(root.left,root.right);
    }
    public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree){
        //1检查结构是否相同---一个为空一个不为空
        if(leftTree != null && rightTree == null || leftTree ==null &&
 rightTree !=null){
            return false;
        }
        //2检查结构---两个都为空或两个都不为空
        if(leftTree == null && rightTree == null){
            return true;
        }
        
        //3检查结狗---- 处理两个都为空或两个都不为空
        if(leftTree.val != rightTree.val){
            return false;
        }
        //4.此时两个引用都不为空而且节点值一样
        //5开始判断是否对称
        //6满足左子树的左  和 右子树的右  对称 同时 左子树的右  和 右子树的左 对称
        return isSymmetricChild(leftTree.left,rightTree.right)
        && isSymmetricChild(leftTree.right,rightTree.left);
    }
}

 6二叉树的层序遍历OJ链接

我们需要借助队列来实现: 

1判空

2 将root入队列,出队时在让root.left(cur.left)和root.right(cur.right)入队

循环这样的操作,知道队列为空

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null){
            return ret;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            int size = queue.size();
            List<Integer> list = new ArrayList<>();
            while (size > 0){
                TreeNode cur = queue.poll();
                list.add(cur.val);
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
                size--;
            }
            ret.add(list);
        }
        return ret;

    }
}

7二叉树的遍历OJ链接 

读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

 

 1遍历字符串 跳过"#",其他的字符串都new为新Node,此时字符串就是先序遍历的状态

2遍历字符串的时候,我们要把i设置为成员变量防止每次递归后i从0开始

3.遍历二叉树中序输出

import java.util.Scanner;
class TreeNode{
    public char val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode(char val){
        this.val = val;
    }
}
public class Main {
    public static int i = 0;
    public static TreeNode createTree(String str){
        TreeNode root = null;
        if(str.charAt(i) != '#'){
            root = new TreeNode(str.charAt(i));
            i++;
            root.left = createTree(str);
            root.right = createTree(str);
        }else{
            i++;
        }
        return root;
    }
    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 处理多个 case
           String str = in.nextLine();
          TreeNode root =  createTree(str);
           inorder(root);
        }
    }
}

 

  • 47
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
前言 1 章 绪论1 本章概略1 1.1 针对考研数据结构的代码书写规范以及C 与C 语言基础1 1.1.1 考研综合应用题中算法设计部分的代码书写规范1 1.1.2 考研中的C 与C 语言基础3 1.2 算法的时间复杂度与空间复杂度分析基础 12 1.2.1 考研中的算法时间复杂度分析 12 1.2.2 例题选讲 12 1.2.3 考研中的算法空间复杂度分析 14 1.3 数据结构和算法的基本概念 14 1.3.1 数据结构的基本概念 14 1.3.2 算法的基本概念 15 习题 16 习题答案 17 2 章 线性表 20 大纲要求 20 考点与要点分析 20 核心考点 20 基础要点 20 知识点讲解 20 2.1 线性表的基本概念与实现 20 2.2 线性表的结构体定义和基本操作 24 2.2.1 线性表的结构体定义 24 2.2.2 顺序表的操作 26 2.2.3 单链表的操作 29 2.2.4 双链表的操作 33 2.2.5 循环链表的操作 35 ▲真题仿造 35 真题仿造答案与讲解 36 习题 真题精选 37 习题答案 真题精选答案 41 3 章 栈和队列 55 大纲要求 55 考点与要点分析 55 核心考点 55 基础要点 55 知识点讲解 55 2019 版数据结构高分笔记 X 3.1 栈和队列的基本概念 55 3.1.1 栈的基本概念 55 3.1.2 队列的基本概念 56 3.2 栈和队列的存储结构、算法与应用 56 3.2.1 本章所涉及的结构体定义 56 3.2.2 顺序栈 57 3.2.3 链栈 59 3.2.4 栈的应用 60 3.2.5 顺序队 64 3.2.6 链队 66 3.3 抽象数据类型 69 ▲真题仿造 71 真题仿造答案与讲解 71 习题 真题精选 74 习题答案 真题精选答案 79 4 章 串 91 知识点讲解 91 4.1 串数据类型的定义 91 4.1.1 串的定义 91 4.1.2 串的存储结构 91 4.1.3 串的基本操作 92 4.2 串的模式匹配算法 95 4.2.1 简单模式匹配算法 95 4.2.2 KMP 算法 96 4.2.3 KMP 算法的改进 99 习题 102 习题答案 103 5 章 数组、矩阵与广义表 113 知识点讲解 113 5.1 数组 113 5.2 矩阵的压缩存储 114 5.2.1 矩阵 114 5.2.2 特殊矩阵和稀疏矩阵 115 5.3 广义表 121 习题 122 习题答案 123 6 章 树与二叉树 132 大纲要求 132 考点与要点分析 132 核心考点 132 基础要点 132 知识点讲解 132 6.1 树的基本概念 132 6.1.1 树的定义 132 6.1.2 树的基本术语 132 6.1.3 树的存储结构 133 6.2 二叉树 134 6.2.1 二叉树的定义 134 6.2.2 二叉树的主要性质 135 6.2.3 二叉树的存储结构 137 6.2.4 二叉树的遍历算法 137 6.2.5 二叉树遍历算法的改进 146 6.3 树和森林与二叉树的互相转换 155 6.3.1 树转换为二叉树 155 6.3.2 二叉树转换为树 156 6.3.3 森林转换为二叉树 156 6.3.4 二叉树转换为森林 157 6.3.5 树和森林的遍历 157 6.4 树与二叉树的应用 158 6.4.1 二叉排序树与平衡二叉树 158 6.4.2 赫夫曼树和赫夫曼编码 159 ▲真题仿造 162 真题仿造答案与解析 162 习题 真题精选 163 习题答案 真题精选答案 168 7 章 图 183 大纲要求 183 考点与要点分析 183 核心考点 183 基础要点 183 知识点讲解 183 7.1 图的基本概念 183 7.2 图的存储结构 184 7.2.1 邻接矩阵 185 7.2.2 邻接表 186 7.2.3 邻接多重表 187 7.3 图的遍历算法操作 188 7.3.1 深度优先搜索遍历 188 7.3.2 广度优先搜索遍历 189 7.3.3 例题选讲 190 7.4 小(代价)生成树 193 7.4.1 普里姆算法和克鲁斯卡尔算法 193 7.4.2 例题选讲 197 7.5 短路径 198 7.5.1 迪杰斯特拉算法 198 7.5.2 弗洛伊德算法 204 7.6 拓扑排序 207 7.6.1 AOV 网 207 7.6.2 拓扑排序核心算法 207 7.6.3 例题选讲 209 7.7 关键路径 209 7.7.1 AOE 网 209 7.7.2 关键路径核心算法 210 ▲真题仿造 213 真题仿造答案与解析 213 习题 真题精选 215 习题答案 真题精选答案 221 8 章 排序 234 大纲要求 234 考点与要点分析 234 核心考点 234 基础要点 234 知识点讲解 235 8.1 排序的基本概念 235 8.1.1 排序 235 8.1.2 稳定性 235 8.1.3 排序算法的分类 235 8.2 插入类排序 236 8.2.1 直接插入排序 236 8.2.2 折半插入排序 237 8.2.3 希尔排序 238 8.3 交换类排序 240 8.3.1 起泡排序 240 8.3.2 快速排序 241 8.4 选择类排序 243 8.4.1 简单选择排序 243 8.4.2 堆排序 244 8.5 二路归并排序 247 8.6 基数排序 248 8.7 外部排序 252 8.7.1 概念与流程 252 8.7.2 置换-选择排序 253 8.7.3 佳归并树 254 8.7.4 败者树 255 8.7.5 时间与空间复杂度相关问题 257 8.8 排序知识点小结 258 ▲真题仿造 259 真题仿造答案与解析 259 习题 真题精选 260 习题答案 真题精选答案 265 9 章 查找 275 大纲要求 275 考点与要点分析 275 核心考点 275 基础要点 275 知识点讲解 275 9.1 查找的基本概念、顺序查找法、折半查找法 275 9.1.1 查找的基本概念 275 9.1.2 顺序查找法 276 9.1.3 折半查找法 277 9.1.4 分块查找 279 9.2 二叉排序树与平衡二叉树 280 9.2.1 二叉排序树 280 9.2.2 平衡二叉树 283 9.3 B-树的基本概念及其基本操作、B 树的基本概念 286 9.3.1 B-树(B 树)的基本概念 286 9.3.2 B-树的基本操作 288 9.3.3 B 树的基本概念 292 9.4 散列表 293 9.4.1 散列表的概念 293 9.4.2 散列表的建立方法以及冲突解决方法 293 9.4.3 散列表的性能分析 297 ▲真题仿造 298 真题仿造答案与解析 298 习题 真题精选 299 习题答案 真题精选答案 304 10 章 考研中某些算法的分治法解释 318

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值