平衡二叉树

平衡二叉树

↘锁芯ラ 提交于 2019-11-28 14:38:28
平衡二叉树规则:每个节点左右孩子高度差不大于1 package newcoder; /** * 平衡二叉树*/ public class AVLTree<T extends Comparable<T>> { private AVLTreeNode<T> mRoot; // 根结点 // 节点数据结构 class AVLTreeNode<T extends Comparable<T>> { T key; int height; AVLTreeNode<T> left; AVLTreeNode<T> right; public AVLTreeNode(T key, AVLTreeNode<T> left, AVLTreeNode<T> right) { this.key = key; this.left = left; this.right = right; this.height = 0; } } public AVLTree() { mRoot = null; } /* * 获取树的高度 */ private int height(AVLTreeNode<T> tree) { if (tree != null) return tree.height; return 0; } public int height() { return height(mRoot); } /* *

20182330 第十周学习总结

自闭症网瘾萝莉.ら 提交于 2019-11-28 09:49:30
目录 20182330《程序设计与设计结构》 第十周学习总结 教材学习内容总结 周一: 树 二叉树 周三:遍历 周五:堆 教材学习中的问题和解决过程 左单旋 右单旋 双旋转 代码调试中的问题和解决过程 代码托管 上周考试错题总结 结对及互评 点评过的同学博客和代码 其他(感悟、思考等,可选) 学习进度条 参考资料 20182330《程序设计与设计结构》 第十周学习总结 教材学习内容总结 周一: 树 树的定义:树是有n个结点组成的有限集合 n=0,为空树 n》0,有特定节点为根 特点:非线性结构:一个前驱多个后继 。 其他(除根)到根的路径唯一 结点的度:结点的子树数 树的度:结点的最大度数 叶子:度为0 分支点:非终端结点 结点的层次:根为第一层 树的深度:结点的最大层次 有序树无序树 树和森林 树的基本操作 查找插入删除 traverse遍历 存储结构 双亲表示法 define M 100 class PTNode{ ElemType data; int parent} class tree { PTN items[M] int root; int n; 孩子表示法 多重链表 孩子链表(类似于链地址法) 双亲孩子表示法 结合1 2方法 孩子兄弟表示法(左孩子右兄弟) 二叉树 结点至多为2,子树有左右之分 第i层最多有2^(i-1)个结点 深度为k最多有2^K-1个

AVL树的详细实现

强颜欢笑 提交于 2019-11-27 22:03:13
【原文: https://cloud.tencent.com/developer/article/1155143 】 AVL树简介 AVL树的名字来源于它的发明作者G.M. A delson- V elsky 和 E.M. L andis。AVL树是最先发明的自平衡二叉查找树(Self-Balancing Binary Search Tree,简称平衡二叉树)。 一棵AVL树有如下必要条件: 条件一:它必须是二叉查找树。 条件二:每个节点的左子树和右子树的高度差至多为1。 图一中左边二叉树的节点45的左孩子46比45大,不满足二叉搜索树的条件,因此它也不是一棵平衡二叉树。 右边二叉树满足二叉搜索树的条件,同时它满足条件二,因此它是一棵平衡二叉树。 左边二叉树的节点45左子树高度2,右子树高度0,左右子树高度差为2-0=2,不满足条件二; 右边二叉树的节点均满足左右子树高度差至多为1,同时它满足二叉搜索树的要求,因此它是一棵平衡二叉树。 AVL树的查找、插入、删除操作在平均和最坏的情况下都是O(logn),这得益于它时刻维护着二叉树的平衡。如果我们需要查找的集合本身没有顺序,在频繁查找的同时也经常的插入和删除,AVL树是不错的选择。不平衡的二叉查找树在查找时的效率是很低的。 AVL树相关概念 平衡因子 :将二叉树上节点的左子树高度减去右子树高度的值称为该节点的平衡因子BF

20190817-腾讯软件测试岗位现场一面

半城伤御伤魂 提交于 2019-11-27 15:58:32
据面试官说该部门是做分布式存储和云架构的 腾讯软件测试岗位一面现场面试 1 自我介绍 2 研究方向介绍 3 C++内存分配问题(堆 栈 代码区 bss 全局存储区 映射区) 4 虚函数 纯虚函数 5 数据库表联合查询 左连接 右连接 内链接等 6 平衡二叉树(概念 特点 性质 实现) 7 编程题 如何判断一个树是否是平衡二叉树 快速排序算法 输出一个未知长度的单向链表的倒数第k个结点 8 给你一个产品,比如微信,如何进行测试 思路:功能测试 性能测试(同一时间大量用户访问,时间段的影响) 压力测试 数据库测试(数据的添加和修改是否正确保存 用户信息的安全性:如密码明文显示还是进行了编码) 9 为什么要选择软件测试岗位,对软件测试有什么理解 10 未来的职业规划 来源: https://www.cnblogs.com/hy4201/p/11369384.html

剑指offer55 是否是平衡二叉树 Java

荒凉一梦 提交于 2019-11-27 15:40:52
public class IsBalancedTree55 { static class Node { int val; Node left; Node right; public Node(int val) { this.val = val; } @Override public String toString() { return "Node{" + "val=" + val + ", left=" + left + ", right=" + right + '}'; } } public static void main(String[] args) { Node root = new Node(8); Node node21 = new Node(6); Node node22 = new Node(10); Node node31 = new Node(5); Node node32 = new Node(7); Node node33 = new Node(9); Node node34 = new Node(11); root.left = node21; root.right = node22; node21.left = node31; node21.right = node32; node22.left = node33; node22.right =

平衡二叉树

蹲街弑〆低调 提交于 2019-11-27 12:54:36
给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false 。 解:这道题思路是用左右子树的最大深度求解,但如果只求根下的左右子树的深度的话效率太慢,此解法在发现任一子树高度不平衡的情况下即返回 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 bool isBalanced(TreeNode* root) { 13 return findDeep(root)!=-1; 14 } 15 16 int findDeep(TreeNode

平衡二叉树

被刻印的时光 ゝ 提交于 2019-11-27 12:44:54
关键字 :单支二叉树、平衡二叉树、旋转、平衡因子 1、定义:   ①任意一个节点的左右子树高度差的绝对值不超过的1;   ②任意节点的左右子树都是平衡二叉树的二叉查找树。   注意:平衡二叉树只是对一种数据结构的描述。而其实现就有很多种:      包括:AVL树、红黑树、B树、B+树、B*树等 2、为什么要提出平衡二叉树这个概念: (1)首先需要先了解一下“单支二叉树”:   ①定义:每一节点都只有左孩子节点或者都只有右孩子节点的树;   eg:单支二叉树      ②缺点:单支二叉树会让树失去本身身为树的优势。因为对于单支二叉树来说,其搜索的时间复杂度是同链表一样的,是O(n)级别的,而不再是树本身的O(logn)级别。 (2)提出平衡二叉树,正是为了解决当树变成如下“单支二叉树”的情况。 分析:对于一颗普通的二叉树,如果没有加以限制,那么在一定的情况之下就会变成“单支二叉树”。因此为了防止二叉树变成“单支二叉树”,便提出了“平衡二叉树”这个概念。在平衡二叉树中,由于没有节点的左右子树的高度差的绝对值不会超过1,所以此时,就能够保证二叉树不会变成“单支二叉树”。 3、平衡二叉树的判断标准: (1)定义:平衡因子: abs(左子树的高度 - 右子树的高度) (2)作用:判断一棵树是否是平衡二叉树的判断标准。 4、平衡二叉树的特性:自平衡特性 (1)定义

平衡二叉树(AVL Tree)

半世苍凉 提交于 2019-11-27 12:06:53
在学习算法的过程中,二叉平衡树是一定会碰到的,这篇博文尽可能简明易懂的介绍下二叉树的相关概念,然后着重讲下什么事平衡二叉树。 (由于作图的时候忽略了箭头的问题,正常的树一般没有箭头,虽然不影响描述的过程,但是还是需要注意,所以还请读者忽略一下部分图的箭头) 一、二叉(查找)树 二叉查找树(Binary Search Tree)是二叉树的一种,其树节点(internal nodes of the tree)储存着键值并且满足以下特性并如图A所示: 假设u, v, r分别为树的三个结点(nodes),r为树的根节点,u为根的左子树,v为根结点的右子树; 键值大小关系:key(u) < key(r) < key(v),也就是位于根结点(亦或是父节点)的左子树的所有结点的值都是小于根或者父结点的,而位于右子树的结点都大于根或者父结点; 树的外部结点不储存任何的信息。 图A 二叉查找树 二、二叉查找树的操作 2.1 查找(Search) 如若要查找二叉树中的某个元素k,我们会从根节点朝着树结构往下寻找对应的结点,所寻找的结点方向取决于当前结点与所要寻找的结点的值的对比。基于图A,假设我们现在所要寻找的结点是7,那么从根结点开始,我们可以知道7 < 8,那么往下朝着结点值为6的子树走,然后我们发现6 < 7所以此时我们就寻找结点为6的右子树,这时我们发现7 = 7

二叉查找树(查找、插入、删除)——C语言

落爺英雄遲暮 提交于 2019-11-27 06:10:17
AVL树 平衡二叉查找树(Self-balancing binary search tree)又被称为AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本 AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时),二叉搜索树将退化成近似链或链,此时,其操作的时间复杂度将退化成线性的,即O(n)。我们可以通过随机化建立二叉搜索树来尽量的避免这种情况,但是在进行了多次的操作之后,例如在在删除时, 我们总是选择将待删除节点的后继代替它本身,这样就会造成总是右边的节点数目减少,以至于树向左偏沉。这同时也会造成树的平衡性受到破坏,使得它的操作时间复杂度增加 例如下面这种情况: AVL树的特性让二叉搜索树的节点实现平衡

有序链表转平衡二叉树

别说谁变了你拦得住时间么 提交于 2019-11-27 03:30:45
/* 根据链表构造二叉平衡树 * 每次找到中点然后折半 分别作为左右子树 * * */ class Solution { public: TreeNode* sortedListToBST(ListNode* head) { // 找到当前链表的中点 构建二叉树 然后返回当前的根节点 if(!head) return NULL; // 1 2 3 pre p // 这里引入伪头结点是为了防止只有一个节点时(fast->)或者没有节点时 进行特判 但这里可以考虑只有一个或者0个节点情况 ListNode *pseudo = new ListNode(-1), *p=pseudo, *pre=pseudo, *fast=pseudo; pseudo->next = head; while(fast && fast->next){// 循环中一次也没执行就会出错 要么 针对这种情况特判 也么伪头结点 pre = p; p = p->next; fast = fast->next->next; } pre->next = NULL; // 断链 TreeNode *root = new TreeNode(p->val); root->left = sortedListToBST(pseudo->next); root->right = sortedListToBST(p->next);