平衡二叉树

二叉搜索树与平衡二叉树

北城余情 提交于 2020-01-31 04:51:54
二叉搜索树 二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 定义 二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点值; 若其右子树存在,则其右子树中每个节点的值都不小于该节点值。 示例: 平衡二叉树 平衡二叉树(Balanced Binary Tree)具有以下性质: 它是一棵空树或它的左右两个子树的高度差的绝对值不超过1, 并且左右两个子树都是一棵平衡二叉树。 平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,F(n-1)是左子树的节点数量,F(n-2)是右子树的节点数量。 如下图所示,左图是一棵平衡二叉树,根节点10,左右两子树的高度差是1,而右图,虽然根节点左右两子树高度差是0,但是右子树15的左右子树高度差为2,不符合定义,所以右图不是一棵平衡二叉树。 来源: CSDN 作者: 飞飞晗 链接: https://blog.csdn.net/weixin_42247922/article/details/104110921

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

 ̄綄美尐妖づ 提交于 2020-01-30 05:30:02
平衡树初阶—— AVL 平衡二叉查找树 一、什么是二叉树 1. 什么是树。 计算机科学里面的树本质是一个树状图。树首先是一个有向无环图,由根节点指向子结点。但是不严格的说,我们也研究无向树。所谓无向树就是将有向树的所有边看成无向边形成的树状图。树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的。 2. 什么是二叉树。 我们给出二叉树的递归定义如下: (1)空树是一个二叉树。 (2)单个节点是一个二叉树。 (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉树。 二、BST 1. 什么是二叉排序树。 二叉排序树是一种二叉树,它满足树的中序遍历是有序的。 2.BST ( Binary Search Tree )。 二叉查找树是一种最普通的二叉排序树,一般称作BST,也称为B-树。在这棵树中,满足在任意一个子树中,都满足左子树 < 根节点 < 右子树,即该树的中序遍历满足从小到大排序的结果。 3. 如何构造一个二叉排序树? 很显然,要想构造一个BST,就必须在插入节点时,满足下面的原则: (1)如果节点为空,则直接插入到该节点。 (2)如果节点不为空,且要插入的值小于等于当前节点的值,那么则将该节点插入到左子树当中。 (3)如果节点不为空,且要插入的值大于当前节点的值,那么则将该节点插入到右子树当中。 4. 利用 BST

剑指offer-39.平衡二叉树

放肆的年华 提交于 2020-01-25 18:52:42
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 解题思路: 1、如果是空树,则是一颗平衡二叉树; 2、递归遍历左右子树,如果深度之差的绝对值大于1,返回-1; 3、否则返回树的深度,是一颗平衡二叉树 代码实现: public class Solution { public boolean IsBalanced_Solution(TreeNode root) { /* 解题思路: 1、如果是空树,则是一颗平衡二叉树; 2、递归遍历左右子树,如果深度之差的绝对值大于1,返回-1; 3、否则返回树的深度,是一颗平衡二叉树 */ return TreeDepth(root)!=-1; } int TreeDepth(TreeNode root){ if(root==null){ return 0; } int leftDepth,rightDepth; leftDepth = TreeDepth(root.left); rightDepth = TreeDepth(root.right); if(leftDepth == -1 || rightDepth == -1 || Math.abs(leftDepth-rightDepth) > 1){ return -1; }else{ return (leftDepth>rightDepth?leftDepth:rightDepth)

平衡二叉树

我们两清 提交于 2020-01-21 08:49:23
一步一步写平衡二叉树(AVL树) 转载: http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html   平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1,如果插入或者删除一个节点使得高度之差大于1,就要进行节点之间的旋转,将二叉树重新维持在一个平衡状态。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。   平衡二叉树实现的大部分过程和二叉查找树是一样的(学平衡二叉树之前一定要会二叉查找树),区别就在于插入和删除之后要写一个旋转算法去维持平衡,维持平衡需要借助一个节点高度的属性。我参考了机械工业出版社的《数据结构与算法分析-C语言描述》写了一个C++版的代码。这本书的AVLTree讲的很好,不过没有很完整的去描述。我会一步一步的讲解如何写平衡二叉树,重点是平衡二叉树的核心部分,也就是旋转算法。 第一步:节点信息

平衡二叉树(Self-balancing Binary Search Tree)

我的未来我决定 提交于 2020-01-20 01:26:56
Date: 2019-04-11 18:49:18 AVL树的基本操作 1 //存储结构 2 struct node 3 { 4 int data; 5 int height; //记录当前子树的高度(叶子->根) 6 //存储平衡因子的话,无法通过其子树算得该树的平衡因子 7 node *lchild, *rchild; 8 }; 9 10 11 //新建结点 12 node *newNode(int v) 13 { 14 node *root = new node; 15 root->data = v; 16 root->height = 1; 17 root->lchild = root->rchild = NULL; 18 return root; 19 } 20 21 //获取当前结点所在高度 22 int GetHeight(node *root) 23 { 24 if(root == NULL) 25 return 0; 26 return root->height; 27 } 28 29 //计算结点的平衡因子 30 int GetBalanceFactors(node *root) 31 { 32 return GetHeight(root->lchild)-GetHeight(root->rchild); 33 } 34 35 //更新结点高度 36 void

平衡二叉树及其C++实现-AVL

China☆狼群 提交于 2020-01-14 23:56:58
title: 平衡二叉树(AVL) date: 2020-01-14 11:26:36 tags: 数据结构 1.1平衡二叉树的定义 为了解决二叉查找树如果插入的顺序不合适,会导致二叉查找树变成一个单链(可以看二叉查找树文章当中的讨论),例如按照递增序列建立二叉查找树就会导致一边倒的情况,从而无法发挥二叉树可以使得查找保持O(logn)查找的效率。故由使得二叉树的层数越小,导出了平衡二叉树。 AVL依然是一棵二叉查找树 (AVL的命名是由发现这个树的两个苏联科学家G.M.Adekse-Velskil和E.M.Landis提出的),因此一般也称作AVL树。 左子树和右子树的高度之差称为该结点的平衡因子 由于需要对每个结点都要得到平衡因子,故在树的结点中加入一个height用以记录当前结点为根结点的子树的高度 struct node { int v, height; //v为结点权值 height为当前子树高度 node *lchild, *rchild; //左右孩子结点地址 }; 新建结点写法: node* newNode(int v) { node* Node = new node; Node->v = v; //结点权值 Node->height = 1; //结点高度初始为1 Node->lchild = Node->rchild = NULL; //初始状态无左右孩子

leetcode110(平衡二叉树)

≯℡__Kan透↙ 提交于 2020-01-12 15:26:05
平衡二叉树 给定一个二叉树,判断它是否是高度平衡的二叉树。 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。 返回 false 。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public : bool isBalanced ( TreeNode * root ) { if ( ! root ) return true ; if ( abs ( getDepth ( root - > left ) - getDepth ( root - > right ) ) > 1 ) return false ; return isBalanced ( root - > left ) && isBalanced ( root - > right ) ; } int getDepth ( TreeNode * root ) { if ( ! root ) return 0 ; return 1 + max (

1773 Problem A:平衡二叉树的基本操作

社会主义新天地 提交于 2020-01-12 01:34:02
在本题中,读入一串整数,首先利用这些整数构造一棵平衡二叉树。另外给定多次查询,利用构造出的平衡二叉树,判断每一次查询是否成功。 输入 输入的第一行包含2个正整数n和k,分别表示共有n个整数和k次查询。其中n不超过500,k同样不超过500。 第二行包含n个用空格隔开的正整数,表示n个整数。 第三行包含k个用空格隔开的正整数,表示k次查询的目标。 输出 只有1行,包含k个整数,分别表示每一次的查询结果。如果在查询中找到了对应的整数,则输出1,否则输出0。 请在每个整数后输出一个空格,并请注意行尾输出换行。 样例输入 1 3 5 7 8 9 10 15 9 2 5 样例输出 1 0 1 #include<iostream> #include<algorithm> #include<vector> using namespace std; struct node { int v, h; node* lchild; node* rchild; node(int v) :v(v) { h = 1; lchild = rchild = NULL; } }; int getHeight(node *root) { if (root == NULL) { return 0; } return root->h; } void updateHeight(node* root) { root->h

平衡二叉树的java实现

江枫思渺然 提交于 2020-01-09 05:00:54
转载请注明出处! 一、概念 平衡二叉树是一种特殊的二叉搜索树,关于二叉搜索树,请查看上一篇博客 二叉搜索树的java实现 ,那它有什么特别的地方呢,了解二叉搜索树的基本都清楚,在按顺序向插入二叉搜索树中插入值,最后会形成一个类似链表形式的树,而我们设计二叉搜索树的初衷,显然是看中了它的查找速度与它的高度成正比,如果每一颗二叉树都像链表一样,那就没什么意思了,所以就设计出来了平衡二叉树,相对于二叉搜索树,平衡二叉树的一个特点就是,在该树中,任意一个节点,它的左右子树的差的绝对值一定小于2。关于它的演变什么的,请自行网上搜索答案。在本文中,为了方便,也是采用了int型值插入。 二、平衡二叉树的构建 它的类相对于二叉搜索树也并没有什么特殊之处,不做过多讲解,直接上代码 1 static class Node{ 2 Node parent; 3 Node leftChild; 4 Node rightChild; 5 int val; 6 public Node(Node parent, Node leftChild, Node rightChild,int val) { 7 super(); 8 this.parent = parent; 9 this.leftChild = leftChild; 10 this.rightChild = rightChild; 11 this.val

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

瘦欲@ 提交于 2020-01-08 06:29:48
AVL树 平衡二叉查找树(Self-balancing binary search tree)通常是指一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且任意节点的左右两个子树都是一棵平衡二叉树(即严格的平衡二叉查找树, “严格”二字体现在任意节点的左右子树高度差不超过1 ),平衡二叉树有多种实现方法(红黑树、AVL、替罪羊树、Treap、伸展树等) 本篇随笔分析的AVL树( AVL树是根据它的发明者G. M. A delson- V elskii和 E. M. L andis命名的 ),是在二叉查找树的基础上一个优化版本(AVL树是严格的二叉查找树,而红黑树不是,红黑树是非严格的二叉查找树,红黑树有自己的一套规则来保证整棵树接近平衡) AVL树的特点: 1.本身首先是一棵二叉查找树 2.带有平衡条件:每个结点的左右子树的高度之差的绝对值不超过1, 也就是说,AVL树,本质上是带了平衡功能的二叉查找树 如果读者关于二叉查找树还不了解可以看一下这篇随笔: 二叉查找树(查找、插入、删除) AVL树的作用 AVL树解决了二叉查找树可能出现的极端情况,对于一般的二叉搜索树(Binary Search Tree),其期望高度(即为一棵平衡树时)为log2n,其各操作的时间复杂度(O(log2n))同时也由此而决定,但是在某些极端情况下 (如在插入的序列是有序的时)