算法是基础,小蓝同学准备些总结一系列算法分享给大家,这是第6篇《二叉树查找》,非常赞!希望对大家有帮助,大家会喜欢! 前面系列文章: 归并排序 #算法基础#选择和插入排序 由快速排序到分治思想 算法基础:优先队列 二分查找 1、二叉树 在链接二叉树查找之前我们要了解一下二叉树是个什么玩意。 二叉树指的数一颗最多只有两个两个子树的数据树型数据结构。其两个子树分别称为左子树和右子树,一个在根节点的左边,一个在根节点的右边 这就是一颗二叉树。下面这些都是二叉树。 ? 2、二叉查找树 在了解了二叉树的前提下,我们可以聊聊二叉查找树。二叉查找树是一个特殊的二叉树。他同样具有最多只有两个子树的特性。但是他的特别点在于其左子树大于根节点。其右子树小于根节点。 ? 插入速度更快二分查找插入的速度是N/2 插入速度是1.39lgN 缺点:查找慢和二分查找对比起来二分查找的查找速度为lgN 所以比二分查找慢39% 应用: 我们之后会说的二三树,红黑树,B-树都是基于二叉查找树扩展实现的,理解了二叉树
给出一个完全二叉树,求出该树的节点个数。 说明: 完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。 示例: 输入: 1 / \ 2 3 / \ / 4 5 6 输出: 6 解题思路: 1,递归遍历整个二叉树,这个方法可以优化 2,计算左右子树的高度l,r A,如果l=r 说明左子树是满二叉树,节点数为 2^l-1,右子树需要递归计算 B,如果l=r+1 说明右子树是满二叉树,节点数为2^r-1,左子树需要递归计算 3,树的节点数为 根(1)+左子树的节点数+右子树的节点数
二叉树结构: 1 class TreeNode { 2 int val; 3 TreeNode left; 4 TreeNode right; 5 TreeNode(int x) { val = x; } 6 } 注:点击左下角的阅读原文即可跳转到原文,可以提交代码 解答思路 在上题中我说了对于与二叉树有关的题目,90% 是采取递归的方式来解决比较简单的。 而且解法还都非常相似,没看过上道题的或许可以看一下:剑指offer打卡5:二叉树的子结构 如果你递归学了还不错的话,这道题用递归会很简单,我们假设函数 Mirror() 就是求源二叉树的镜像。 刚开始的源二叉树: ? return; 5 root = solve(root); 6 } 7 private TreeNode solve(TreeNode root)
本题要求给定二叉树的4种遍历。
1.2与树有关的概念 如图是树形结构: 节点的度:一个节点含有的子树的个数称为该节点的度; 如上图:A的为6; 叶节点或终端节点:度为0的节点称为叶节点; 如上图:B、C、H、I…等节点为叶节点 一个节点含有的子树的根节点称为该节点的子节点; 如上图:B是A的孩子节点; 兄弟节点:具有相同父节点的节点互称为兄弟节点; 如上图:B、C是兄弟节点; 树的度:一棵树中,最大的节点的度称为树的度; 如上图:树的度为6; 满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k - 1 ,则它就是满二叉树。 2. 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。 log2(n+1)(ps:log是以2为底,n+1为对数) 6.对于具有n个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从0开始编号,则对于序号为i的结点有: 若i>0,i位置节点的双亲序号
二叉树的前序遍历 - 力扣(LeetCode) /* 解题思路: 此题要保存节点,所以需要先获取节点个数,然后进行前序遍历,保存每一个节点值。
本题要求给定二叉树的高度。 Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 要求函数返回给定二叉树
蛇形打印二叉树 题目 : 按照图示绿色轨迹打印二叉树.
重建二叉树 Leetcode : https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof GitHub : https://github.com ,请构建该二叉树并返回其根节点。 •空间复杂度 O(N) :HashMap 使用 O(N) 额外空间;最差情况下(输入二叉树为链表时),递归深度达到 N ,占用 O(N) 的栈帧空间;因此总共使用 O(N) 空间。 class Solution { public static void main(String[] args) { int[] preorder = {1, 2, 4, 7, 3, 5, 6, 8}; int[] inorder = {4, 7, 2, 1, 5, 3, 8, 6}; } /** * 思路:先找出根节点,然后利用递归方法构造二叉树 *
目录 一.课本知识点 1.树的基本概念 a.树的定义 b.若干术语 c.逻辑结构 d.存储结构 e.树的运算 2.二叉树 a.二叉树的定义 b.二叉树的性质 c.二叉树的存储结构 3.遍历二叉树和线索二叉树 (应当是二叉排序树的特点) ( × )6.二叉树中所有结点个数是2k-1-1,其中k是树的深度。(应2i-1) ( × )7.二叉树中所有结点,如果不存在非空左子树,则不存在非空右子树。 一棵深度为6的满二叉树有 n1+n2=0+ n2= n0-1=31 个分支结点和 26-1 =32 个叶子。 注:满二叉树没有度为1的结点,所以分支结点数就是二度结点数。 3. 完全二叉树的特点决定不可能有左空右不空的情况,所以非空右子树数=0. 6. 一棵含有n个结点的k叉树,可能达到的最大深度为 n ,最小深度为 2 。 ③ 允许叶结点相交 ④ 允许树枝结点相交 C: ①权 ② 维数 ③ 次数(或度) ④ 序 答案:ABC=1,1,3 6.
B站搜索“乐哥聊编程“有本篇文章配套视频 https://www.bilibili.com/video/BV1ZV4y1g7hT 二叉树 对半搜索,每个节点最多两个孩子 左侧孩子小于根节点,右侧孩子大于等于根节点 二叉排序树的查找性能在0(Log2n)到O(n)之间 正常情况下长这样 极端情况下长这样 如果长这样的,查找时间复杂度就是O(n)了,那么就得靠平衡二叉树优化了,现在有请平衡二叉树登场... 平衡二叉树 满足二叉树 任何节点的两个子树的高度最大差为1 如果对平衡二叉树进行删除和新增,那么会破坏平衡,就会出发旋转,最终达到平衡,也成自平衡二叉树 虽然能做到平衡了,避免了O(n),但是每次都进行频繁的左旋或右旋 解释下:这里每个叶子结点(2,4,6,55)都有一个黑色的NULL节点,那么从根节点003到任意的null节点都会经过相同个数的黑色节点(包括黑色的null节点),这样懂了吧。
(空二叉树),或由一个根节点和两颗互不相交的、分别称为根节点的左子树和右子树的二叉树组成; 这样看来,二叉树可以使用递归来创建。 特点: 每个节点最多有两个子节点; 二叉树中最大的度为2; 无论有几个分支,都需要区分是左子树还是右子树; 二、分类及实现 2.1 分类 斜二叉树:只有左子节点或只有右子节点的二叉树称为斜二叉树; ? 满二叉树特点: 叶子结点只能; 非叶子节点的结点的度为2; 完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点位置完全相同; ? 完全二叉树特点: 叶子结点只能出现在最下两层; 最下层的叶子结点一定集中在左边并且连续; 若结点度为1,则该节点只有左子节点; 注:满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树; 线索二叉树 2.2 普通二叉树 2.2.1 二叉树的遍历分类 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有节点,使得每个 节点被访问依次且仅被访问一次。
满二叉树: 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点 完全二叉树: 完全二叉树是由满二叉树而引出来的。 对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 如下图 满二叉树都是完全二叉树 完全二叉树依次填满直至满二叉树的阶段,每一个树都是完全二叉树 二叉搜索树 它是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点值 平衡二叉树定义(AVL): 它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 详情点击参考链接https://www.jianshu.com/p/1bbb19156454 红黑树和平衡二叉树的区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下
题目描述 给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。 示例1 输入:{2,1,3} 返回值:true,true 基本概念 搜索二叉树(Binary Search Tree - BST) 它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空 完全二叉树(Complete Binary Tree- CBT) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。 经典应用:堆 完全二叉树由满二叉树转化而来,也就是将满二叉树从最后一个节点开始删除,一个一个从后往前删除,剩下的就是完全二叉树。 实现代码 # 思路:利用递归进行中序遍历,通过判断中序遍历序列是否有序来判定是否为搜索二叉树 def isBSTmidTravelsal(self,root): res = [] def
题目 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 思路 还是用二叉树的框架就行,每个节点的最大深度就是左子树或右子树中的最大深度加1 /** * Definition for a binary tree node.
二叉树直径的定义:二叉树中路径的最大长度 二叉树中路径的最大长度,可以理解所有节点的左右子树高度之和的最大值。 假设二叉树有n个节点,编号为{a1,a2,…,an}, 其对应的左右子树的高度之和为H = {h1,h2,h3,…,hn}, 则该二叉树的直径为max(H)。
❝之前讲解的都是遍历二叉树,这次该构造二叉树了 ❞ 106.从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 从前序与中序遍历序列构造二叉树 根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 后序和中序可以唯一确定一颗二叉树。 那么前序和后序可不可以唯一确定一颗二叉树呢? 「前序和后序不能唯一确定一颗二叉树!」,因为没有中序遍历无法确定左右部分,也就是无法分割。 举一个例子: ? 所以前序和后序不能唯一确定一颗二叉树! 总结 之前我们讲的二叉树题目都是各种遍历二叉树,这次开始构造二叉树了,思路其实比较简单,但是真正代码实现出来并不容易。 最后我还给出了为什么前序和中序可以唯一确定一颗二叉树,后序和中序可以唯一确定一颗二叉树,而前序和后序却不行。 认真研究完本篇,相信大家对二叉树的构造会清晰很多。
题目 给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 思路 判断二叉树是否对称可以理解为判断一个节点的两个子树的里侧和外侧是否对称,就是后序遍历。 判断外侧是否对称,传入左节点的左孩子,右节点的右孩子。
完全二叉树(Complete Binary Tree- CBT) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。 经典应用:堆 平衡二叉树(Self-balancing binary search tree) 它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 总的一句话就是,任意节点左右子树的高度差不超过1 2、搜索二叉树的判断 思路 由于搜索二叉树的特性,根节点 > 左,根节点 < 右,那么其中序遍历的顺序必然是升序的。 思路 根据完全二叉树排列特性,必然先挂左边的树,可以得出以下结论: 1、如果一个树,有右孩子,没有左孩子,那么必然不是满二叉树 2、如果一个树,只有左孩子,那么后续节点必然都是叶子节点,才能是满二叉树 /// 判断是否是满二叉树 /// 1、如果一个树,有右孩子,没有左孩子,那么必然不是满二叉树 /// 2、如果一个树,只有左孩子,那么后续节点必然都是叶子节点,才能是满二叉树
题目 在一个 m*n 的二维字符串数组中输出二叉树,并遵守以下规则: 行数 m 应当等于给定二叉树的高度。 列数 n 应当总是奇数。 根节点的值(以字符串格式给出)应当放在可放置的第一行正中间。 , "", "", "", "", ""] ["4", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]] 注意: 二叉树的高度在范围 解题 先求二叉树高度height 根据高度知道列的宽度width = 2^height - 1 递归在区间中点填入节点的val的string格式 class Solution { public: