zcy算法入门笔记003-树
相同的树
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);}
对称二叉树
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);}
二叉树的最大深度
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;}
二叉树的最小深度
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;}
平衡二叉树
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);}
从前序与中序遍历序列构造二叉树
特殊判断: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;}}
二叉树的层序遍历 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;}}
验证二叉搜索树
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);
// }
平衡二叉搜索树
分别判断是否是平衡二叉树、是否是搜索二叉树。
zcy算法入门笔记003-树相关推荐
- zcy算法入门笔记004
路径总和 判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum .如果存在,返回 true :否则,返回 false . public static c ...
- zcy算法入门笔记001
笔记仅用于学习,如有错误欢迎指正,谢谢 位运算 public class Code01_PrintBinary {public static void print(int num){//十进制=> ...
- zcy算法入门笔记002-位图
一.前置知识点:左移.右移.无符号右移 <<:左移 左边最高位丢弃,右边补0(高位向左移动,低位补零) 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2. >>:右移 ...
- 刘汝佳算法入门笔记(1)
刘汝佳算法入门笔记 习题4-2 习题4-2 有n行n列(2≤n≤9)的小黑点,还有m条线段连接其中的一些黑点.统计这些线段连成 了多少个正方形(每种边长分别统计). 行从上到下编号为1-n,列从左到右 ...
- 发现水贴(算法入门题目003)
题目 我们有一个ID列表,其中存着某论坛所有帖子的作者ID. 另外,我们已经得到准确情报,在这个长长的列表中,有3个ID,每个出现次数都超过了总数的1/4.这毫无疑问是职业水军干的. 你的任务是快速地 ...
- [算法入门笔记] 9. 哈希表与哈希函数
文章目录 1. 哈希表与哈希函数的实现 2. 设计RandomPool结构 3. bitmap 3.1 概述 3.2 常用操作 3.2.1 存储数据 3.2.2 添加操作 3.2.3 删除操作 3.2 ...
- [算法入门笔记] 18. 动态规划
动态规划往往是有套路的,但套路是建立在熟练的基础上的~ 文章目录 0 建议 1 机器人达到指定位置的方法数 1.1 暴力递归 1.2 记忆化搜索 1.3 动态规划 2 换钱的最少货币数 2.1 暴力递 ...
- 数据结构与算法入门(follow 左神)
文章目录 一. 认识时间复杂度和简单排序算法 1.以选择排序为例 2.异或运算 3.插入排序 4.二分查找 5.对数器 二. 认识O(NlogN)的排序 1.递归==栈的后序遍历 2.归并排序 3.快 ...
- 机器学习入门笔记(三):K近邻算法
文章目录 一.K近邻算法的基本概念 1.1 K近邻算法实现 二.K近邻分类三要素 2.1 距离度量 2.2 K值的选择 2.2.1 基于m-fold cross validation的 K值选择 2. ...
最新文章
- Uber无人车撞人视频公布,究竟哪儿出问题了?
- 使用pydub做静音帧去除
- 认房又认贷 政策的真正意图——限购令如果没有同时增加土地供应,只是在变相加剧未来房价的上涨...
- centos 上假设svnserve
- python脚本创建拓扑_实验 1:Mininet --拓扑的命令脚本生成
- 其他平台上测试工具的使用
- 使用git新增分支以及初始化分支等等一些列操作实战
- 数据库(5)SQL约束
- 云存储服务器销售,云存储服务器销售
- 对话框弹出的位置引发的问题showdialog
- Unity lightmap shader
- 什么是configmap资源、secret资源(实战)
- 获取各城市poi数据
- Excel文本如何间隔指定字符插入分隔符
- AtCoder Beginner Contest 062(CD)
- 如何利用VSCode书写Latex并进行编译
- 前端打包之后 运用nginx反向代理运行项目
- 《Google SRE》读后感
- 用了基木鱼还用网站服务器吗,基木鱼操作手册:营销通相关问题
- java医院门诊预约挂号排班系统ssm
热门文章
- 西南交大计算机考研三本,过来人的忠告:西南交通大学机械考研的七个建议
- 编写网页的基本格式(标签)
- 达梦数据库DM8之删除归档日志文件
- 大数据精准营销之客户细分
- 关于蒙版(mask)的了解
- WORD中要选中光标前所有文字和光标后所有文字的快捷键是什么?
- 20_微信小程序-BLE低功耗蓝牙开发-发布小程序
- BTree,B-Tree,B+Tree,B*Tree都是什么
- 中国人非常喜欢6这个数字,因为大家总爱说66大顺啊。数学狂人李某人喜欢把什么都数字化,于是她把顺利这个词也定义了数量级,6代表1级顺利,66代表2级顺利,666代表3级顺利,以此类推。你看,数学狂人的
- C循环链表拉丁方阵问题