1. 相同的树

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;}public static boolean isSameTree(TreeNode p, TreeNode q) {if (p == null ^ q == null) {//有一个为空,另一个不为空的话返回falsereturn false;}if (p == null && q == null) {//空树=空树return true;}// 都不为空:1.头结点的值相等 2.左树同一个结构 3.右树同一个结构return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);}
  1. 对称二叉树

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;}public static boolean isSymmetric(TreeNode root) {return isMirror(root, root);}public static boolean isMirror(TreeNode h1, TreeNode h2) {if (h1 == null ^ h2 == null) {//一个为空、一个不为空则直接falsereturn false;}if (h1 == null && h2 == null) {//空树和空树是镜面关系return true;}//镜面:1.节点值相等 2.我的左树和你的右树是镜面 3.我的右树和你的左树是镜面return h1.val == h2.val && isMirror(h1.left, h2.right) && isMirror(h1.right, h2.left);}
  1. 二叉树的最大深度

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;}// 以root为头的树,最大高度是多少返回!public static int maxDepth(TreeNode root) {if (root == null) {return 0;}return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;}
  1. 二叉树的最小深度

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;}
// 以root为头的树,最小高度是多少返回!public static int minDepth(TreeNode root){if(root==null){return 0;}/*** 叶子节点的定义是左孩子和右孩子都为 null 时叫做叶子节点* 1.如果root节点左右子树都为空,返回0* 2.如果root节点左右子树有一个为空,返回不空子树的深度* 3.如果root节点左右子树都不为空,返回左右子树较小的深度*/int m1 = minDepth(root.left);int m2 = minDepth(root.right);//1.如果左右孩子有空的情况,返回m1+m2+1//2.如果左右孩子都不为空,返回较小深度+1return root.left==null || root.right == null ? m1+m2+1 : Math.min(m1, m2)+1;}
  1. 平衡二叉树

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;TreeNode(int val) {this.val = val;}}public static boolean isBalanced(TreeNode root) {return process(root).isBalanced;}//假设以某个节点为头的时候    1)整棵树是否平   2)整棵树的高度是什么public static class Info {public boolean isBalanced;  //是否平衡public int height;  //高度public Info(boolean i, int h) {isBalanced = i;height = h;}}public static Info process(TreeNode root) {if (root == null) {     //空树是平衡树、高度0return new Info(true, 0);}//不为空时,去左右子树收集信息Info leftInfo = process(root.left);Info rightInfo = process(root.right);//高度为左右子树最大值+1int height = Math.max(leftInfo.height, rightInfo.height) + 1;//要求左树整体平衡、右树整体平衡、左右子树高度差的绝对值<2boolean isBalanced = leftInfo.isBalanced && rightInfo.isBalanced&& Math.abs(leftInfo.height - rightInfo.height) < 2;return new Info(isBalanced, height);}
  1. 从前序与中序遍历序列构造二叉树

特殊判断:L1>R1

情况:出现越界,说明这时候是空树,应该返回null

代码

import java.util.HashMap;//测试链接:https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
public class Code05_ConstructBinaryTreeFromPreorderAndInorderTraversal {/*用先序数组和中序数组重建一棵树*/public static class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int val) {this.val = val;}}public static TreeNode buildTree1(int[] pre, int[] in) {if (pre == null || in == null || pre.length != in.length) {return null;}return f(pre, 0, pre.length - 1, in, 0, in.length - 1);}// 有一棵树,先序结果是pre[L1...R1],中序结果是in[L2...R2]// 请建出整棵树返回头节点public static TreeNode f(int[] pre, int L1, int R1, int[] in, int L2, int R2) {if (L1 > R1) {  //控制范围return null;}TreeNode head = new TreeNode(pre[L1]);if (L1 == R1) {     //只有一个节点return head;}int find = L2;while (in[find] != pre[L1]) {   //通过遍历寻找头结点,可以优化find++;}head.left = f(pre, L1 + 1, L1 + find - L2, in, L2, find - 1);head.right = f(pre, L1 + find - L2 + 1, R1, in, find + 1, R2);return head;}public static TreeNode buildTree2(int[] pre, int[] in) {if (pre == null || in == null || pre.length != in.length) {return null;}//空间换时间的优化:在整个过程开始前把中序数组每一个值在哪记到表中,直接从表中查下标,省去遍历HashMap<Integer, Integer> valueIndexMap = new HashMap<>();for (int i = 0; i < in.length; i++) {valueIndexMap.put(in[i], i);}return g(pre, 0, pre.length - 1, in, 0, in.length - 1, valueIndexMap);}// 有一棵树,先序结果是pre[L1...R1],中序结果是in[L2...R2]// 请建出整棵树返回头节点public static TreeNode g(int[] pre, int L1, int R1, int[] in, int L2, int R2,HashMap<Integer, Integer> valueIndexMap) {if (L1 > R1) {return null;}TreeNode head = new TreeNode(pre[L1]);if (L1 == R1) {return head;}int find = valueIndexMap.get(pre[L1]);  //省去遍历 直接查表head.left = g(pre, L1 + 1, L1 + find - L2, in, L2, find - 1, valueIndexMap);head.right = g(pre, L1 + find - L2 + 1, R1, in, find + 1, R2, valueIndexMap);return head;}}
  1. 二叉树的层序遍历 II

思路:头节点先加入队列,依据此时队列长度然后依次弹出节点,此时出队节点有左孩子,则左孩子先加入队列,节点有右孩子,则右孩子加入队列,每趟循环弹出一层节点用链表结构收集起来。

代码

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;// 测试链接:https://leetcode.com/problems/binary-tree-level-order-traversal-ii
public class Code01_BinaryTreeLevelOrderTraversalII {public static class TreeNode {public int val;public TreeNode left;public TreeNode right;TreeNode(int val) {this.val = val;}}/***  二叉树的层序遍历 II*/public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List<Integer>> ans = new LinkedList<>();if (root == null) {return ans;}Queue<TreeNode> queue = new LinkedList<>();queue.add(root);while (!queue.isEmpty()) {int size = queue.size();List<Integer> curAns = new LinkedList<>();for (int i = 0; i < size; i++) {TreeNode curNode = queue.poll();curAns.add(curNode.val);if (curNode.left != null) {queue.add(curNode.left);}if (curNode.right != null) {queue.add(curNode.right);}}ans.add(0, curAns);}return ans;}}
  1. 验证二叉搜索树

public static class TreeNode {public int val;public TreeNode left;public TreeNode right;TreeNode(int val) {this.val = val;}}public static class Info {// 递归:对所有节点一视同仁,信息要同等全,每个节点返回三个信息public boolean isBST;   //1.整体是否是搜索二叉树public int max;         //2.整棵树最大值public int min;         //3.整棵树最小值public Info(boolean is, int ma, int mi) {isBST = is;max = ma;min = mi;}}//    public static Info process(TreeNode x) {
//        if (x == null) {    //考虑单个负节点情况,空的情况:不能设最大值、最小值为0//在判空时返回空信息,要把判空的任务交给上游去判断
//            return null;
//        }//先向左、右树去收集信息:可能都空、都不空、其中一个空
//        Info leftInfo = process(x.left);
//        Info rightInfo = process(x.right);
//        int max = x.val;
//        int min = x.val;//子树不为空时,有可能比我节点的max大,min小
//        if (leftInfo != null) {
//            max = Math.max(leftInfo.max, max);
//            min = Math.min(leftInfo.min, min);
//        }
//        if (rightInfo != null) {
//            max = Math.max(rightInfo.max, max);
//            min = Math.min(rightInfo.min, min);
//        }//先认为是搜索二叉树
//        boolean isBST = true;//左树不为空且左树已经不是搜索二叉树了
//        if (leftInfo != null && !leftInfo.isBST) {
//            isBST = false;
//        }//右树不为空且右树已经不是搜索二叉树了
//        if (rightInfo != null && !rightInfo.isBST) {
//            isBST = false;
//        }// left max < x?   right min > x?// 左树空时默认左树max<x,不空时实际去判断一下max是否<x,右树同理
//        boolean leftMaxLessX = leftInfo == null ? true : (leftInfo.max < x.val);
//        boolean rightMinMoreX = rightInfo == null ? true : (rightInfo.min > x.val);
//        if (!(leftMaxLessX && rightMinMoreX)) {
//            isBST = false;
//        }
//        return new Info(isBST, max, min);
//    }
  1. 平衡二叉搜索树

分别判断是否是平衡二叉树、是否是搜索二叉树。

zcy算法入门笔记003-树相关推荐

  1. zcy算法入门笔记004

    路径总和 判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 true :否则,返回 false . public static c ...

  2. zcy算法入门笔记001

    笔记仅用于学习,如有错误欢迎指正,谢谢 位运算 public class Code01_PrintBinary {public static void print(int num){//十进制=> ...

  3. zcy算法入门笔记002-位图

    一.前置知识点:左移.右移.无符号右移 <<:左移 左边最高位丢弃,右边补0(高位向左移动,低位补零) 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2. >>:右移 ...

  4. 刘汝佳算法入门笔记(1)

    刘汝佳算法入门笔记 习题4-2 习题4-2 有n行n列(2≤n≤9)的小黑点,还有m条线段连接其中的一些黑点.统计这些线段连成 了多少个正方形(每种边长分别统计). 行从上到下编号为1-n,列从左到右 ...

  5. 发现水贴(算法入门题目003)

    题目 我们有一个ID列表,其中存着某论坛所有帖子的作者ID. 另外,我们已经得到准确情报,在这个长长的列表中,有3个ID,每个出现次数都超过了总数的1/4.这毫无疑问是职业水军干的. 你的任务是快速地 ...

  6. [算法入门笔记] 9. 哈希表与哈希函数

    文章目录 1. 哈希表与哈希函数的实现 2. 设计RandomPool结构 3. bitmap 3.1 概述 3.2 常用操作 3.2.1 存储数据 3.2.2 添加操作 3.2.3 删除操作 3.2 ...

  7. [算法入门笔记] 18. 动态规划

    动态规划往往是有套路的,但套路是建立在熟练的基础上的~ 文章目录 0 建议 1 机器人达到指定位置的方法数 1.1 暴力递归 1.2 记忆化搜索 1.3 动态规划 2 换钱的最少货币数 2.1 暴力递 ...

  8. 数据结构与算法入门(follow 左神)

    文章目录 一. 认识时间复杂度和简单排序算法 1.以选择排序为例 2.异或运算 3.插入排序 4.二分查找 5.对数器 二. 认识O(NlogN)的排序 1.递归==栈的后序遍历 2.归并排序 3.快 ...

  9. 机器学习入门笔记(三):K近邻算法

    文章目录 一.K近邻算法的基本概念 1.1 K近邻算法实现 二.K近邻分类三要素 2.1 距离度量 2.2 K值的选择 2.2.1 基于m-fold cross validation的 K值选择 2. ...

最新文章

  1. Uber无人车撞人视频公布,究竟哪儿出问题了?
  2. 使用pydub做静音帧去除
  3. 认房又认贷 政策的真正意图——限购令如果没有同时增加土地供应,只是在变相加剧未来房价的上涨...
  4. centos 上假设svnserve
  5. python脚本创建拓扑_实验 1:Mininet --拓扑的命令脚本生成
  6. 其他平台上测试工具的使用
  7. 使用git新增分支以及初始化分支等等一些列操作实战
  8. 数据库(5)SQL约束
  9. 云存储服务器销售,云存储服务器销售
  10. 对话框弹出的位置引发的问题showdialog
  11. Unity lightmap shader
  12. 什么是configmap资源、secret资源(实战)
  13. 获取各城市poi数据
  14. Excel文本如何间隔指定字符插入分隔符
  15. AtCoder Beginner Contest 062(CD)
  16. 如何利用VSCode书写Latex并进行编译
  17. 前端打包之后 运用nginx反向代理运行项目
  18. 《Google SRE》读后感
  19. 用了基木鱼还用网站服务器吗,基木鱼操作手册:营销通相关问题
  20. java医院门诊预约挂号排班系统ssm

热门文章

  1. 西南交大计算机考研三本,过来人的忠告:西南交通大学机械考研的七个建议
  2. 编写网页的基本格式(标签)
  3. 达梦数据库DM8之删除归档日志文件
  4. 大数据精准营销之客户细分
  5. 关于蒙版(mask)的了解
  6. WORD中要选中光标前所有文字和光标后所有文字的快捷键是什么?
  7. 20_微信小程序-BLE低功耗蓝牙开发-发布小程序
  8. BTree,B-Tree,B+Tree,B*Tree都是什么
  9. 中国人非常喜欢6这个数字,因为大家总爱说66大顺啊。数学狂人李某人喜欢把什么都数字化,于是她把顺利这个词也定义了数量级,6代表1级顺利,66代表2级顺利,666代表3级顺利,以此类推。你看,数学狂人的
  10. C循环链表拉丁方阵问题