平衡二叉树你了解吗?

数据结构在自考的时候学过,所以一些简单的概念大概了解,可是必然考纲不一样,所以在软考中还是会有一些陌生的知识,如今就说一下平衡二叉树

一、什么是平衡二叉树

依据二叉树的基本概念可想到:平衡二叉树的左右子树都是平衡二叉树;除此之外,左子树和右子树的高度差的绝对值不能超过1

二、平衡二叉树的作用

由于在二叉排序树查找过程中,仅仅有树的形态比較均匀的时候,查找效率才干比較好,因此採用平衡二叉树能够使得在构造二叉排序树的时候使得其保持均匀,从而能够提高查找效率;所以平衡二叉树一定是二叉排序树。

三、平衡二叉树的插入

插入的情况分为四类:左子树的左子树插入,右子树的右子树插入,左子树的右子树插入,右子树的左子树插入;依据四种插入的情况,有四种调整平衡的规律,归纳例如以下:

(1)单向右旋(针对于左子树的左子树插入结点点1)

(2)单向左旋(针对于右子树的右子树插入结点5)

(3)先左后右双向旋转(针对于左子树的右子树插入结点3)

(4)先右后左双向旋转(针对于右子树的左子树插入结点18)

四、平衡二叉树的删除

平衡二叉树的删除同二叉排序树的删除是一样的,可是须要在二叉排序树的基础上保持平衡。

(1)删除叶子结点

直接删除就可以,然后进行平衡调整

(2)删除仅仅有一个子树的结点

用要删除结点的左子树(右子树)取代删除结点,直接删除就可以,然后进行平衡调整

(3)删除有两个子树的结点

这样的情况比較复杂,可分两种情况进行删除操作:

a.假设该节点的平衡因子为0或者1,则找到其左子树中具有最大值的节点max(中序遍历的直接前驱)将max的内容与x的内容交换,而且max即为新的要删除的节点

b.假设该节点的平衡因子为-1,则找到其右节点中具有最小值的节点min(中序遍历的直接后继),将min的内容与x的内容交换,而且min即为新的要删除的节点。

不要忘记删除后要进行平衡调整。

时间: 2024-10-13 02:58:34

平衡二叉树你了解吗?的相关文章

大话数据结构—平衡二叉树(AVL树)

平衡二叉树(Self-Balancing Binary Search Tree/Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个节点的左子树和右子树的高度差至多等于1. 平衡二叉树的前提是二叉排序树,不是二叉排序树的都不是平衡二叉树. 平衡因子BF(Balance Factor):二叉树上节点的左子树深度减去右子树深度的值. 最小不平衡子树:距离插入节点最近的,且平衡因子的绝对值大于1的节点为根的子树. 下图中,新插入节点37时,距离它最近的平

Balanced Binary Tree(平衡二叉树)

来源:https://leetcode.com/problems/balanced-binary-tree Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never diff

平衡二叉树

1.基础知识 平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:1.它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.2.其高度一般都良好地维持在O(log2n),大大降低了操作的时间复杂度.3.平衡二叉树的常用算法有红黑树.AVL.Treap等. 4.最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点,

数据结构—平衡二叉树

二叉排序树集中了数组的查找优势以及链表的插入.删除优势,因此在数据结构中占有一定的地位.但在一定的情况下二叉排序树又有可能变为链表,例如插入从1~100的数,这时进行数据查找的效率就要降低. 为了解决二叉排序树这种左右子树深度不均匀的情况引入了一种平衡二叉树(AVLTree):任何一个节点的左右子树深度差不超过1.通过这个限定,阻止了二叉树的左右子树深度差较大的情况,维持了二叉树的稳定. 如何让二叉树的左右子树深度差不超过1呢?这就需要对节点进行旋转,也就是当某个节点的左右子树深度超过1时需要对

二叉树的建立以及相关操作,平衡二叉树

二叉树的一些属性: int datdID;double data;TreeNode leftTree;TreeNode rightTree;TreeNode parent; //构建一个二叉树,将数据都放入了一个LIST里面    int selfID = 0;    public TreeNode creatTree(List<Double>datas,TreeNode tree){        if(datas.size()!=0){            TreeNode node =

平衡二叉树的构树过程

1 package testStudy; 2 /**平衡因子枚举类*/ 3 enum BalanceFactor{ 4 LH("左子树高"),EH("左右等高"),RH("右子树高"); 5 6 private String illustration=""; 7 8 private BalanceFactor(String s){ 9 this.illustration=s; 10 } 11 12 public String

数据结构与算法系列----平衡二叉树(AVL树)

一:背景 平衡二叉树(又称AVL树)是二叉查找树的一个进化体,由于二叉查找树不是严格的O(logN),所以引入一个具有平衡概念的二叉树,它的查找速度是O(logN).所以在学习平衡二叉树之前,读者需要了解二叉查找树的实现,具体链接:二叉查找树 那么平衡是什么意思?我们要求对于一棵二叉查找树 ,它的每一个节点的左右子树高度之差不超过1.(对于树的高度的约定:空节点高度是0:叶子节点高度是1.)例如下图: 如果我们的二叉查找树是不平衡该怎么办?进行旋转.经过分析发现,出现不平衡无外乎四种情况,下面我

数据结构例程——平衡二叉树

本文是[数据结构基础系列(8):查找]中第8课时[平衡二叉树]的例程. 平衡二叉树相关算法 #include <stdio.h> #include <malloc.h> typedef int KeyType; //定义关键字类型 typedef char InfoType; typedef struct node //记录类型 { KeyType key; //关键字项 int bf; //平衡因子 InfoType data; //其他数据域 struct node *lchi

图解平衡二叉树,AVL树(一)

图解平衡二叉树,AVL树(一) 学习过了二叉查找树,想必大家有遇到一个问题.例如,将一个数组{1,2,3,4}依次插入树的时候,形成了图1的情况.有建立树与没建立树对于数据的增删查改已经没有了任何帮助,反而增添了维护的成本.而只有建立的树如图2,才能够最大地体现二叉树的优点. 在上述的例子中,图2就是一棵平衡二叉树.科学家们提出平衡二叉树,就是为了让树的查找性能得到最大的体现(至少我是这样理解的,欢迎批评改正).下面进入今天的正题,平衡二叉树. AVL的定义 平衡二叉查找树:简称平衡二叉树.由前

判断二叉树是不是平衡二叉树

题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树.某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵二叉树. 我们很容易就能想到一个代码简洁却性能不佳的思路:在遍历树的每个结点的时候,调用函数TreeDpth得到它的左右子树的深度.如果每个结点的左右子树的深度相差都不超过1,按照定义它就是一棵平衡的二又树. 较好的思路是:用后序遍历的方式遍历整棵二叉树.在遍历某结点的左右子结点之后,我们可以根据它的左右子结点的深度判断它是不是平衡的,并得到当前结点的深度.当最后遍历到树的根结点