二叉排序树

二叉排序树

牧云@^-^@ 提交于 2019-12-06 16:03:47
二叉树中使用最广泛的就是搜索二叉树; 搜索二叉树还有其它名称:二叉排序树、二叉查找树等; 1.搜索二叉树的优点 1】有很好的查询性能 2】有很好的新增和删除的性能 3】若左子树不空,则左子树上所有结点的值均小于它的根结点的值 4】若右子树不空,则右子树上所有结点的值均大于它的根结点的值 5】左、右子树也分别为二叉排序树 如图:典型的搜索二叉树 对搜索二叉树进行中序遍历的结果就是元素从小到大排序后的结果; 如果二叉树中的元素是基本类型int、short等,可以直接操作; 如果元素是对象,那么该对象的类必须重载运算符><==,因为搜索二叉树就是通过这些运算符来排序的; 搜索二叉树里面不允许有重复元素; 2.搜索二叉树的操作 1)新增元素 例如:在上图的搜索二叉树中新增节点8 比较8和15,因为8<15,所以应该放左子树,如果左子树的节点没值就直接写到这里,有值就要继续比较; 比较8和5,8>5,放右子树; 8<12,放左边; 8<10,放左边; 8>6,放右边; 8>7,放右边,7的右子树是空的,因此8放这里; 因此8应该放在以7为父节点的右子树中; 例如:新增18 经过一系列查找,树中原本有一个18; 因为搜索二叉树中不允许重复元素,因此直接返回; 2)查找元素 例如:从上面图的二叉树中找6 6<15,从左找; 6>5,往右找; 6<12,往左找; 6<10,往左找,然后找到了;

非递归二叉排序树

江枫思渺然 提交于 2019-12-05 10:04:33
#include<iostream> #include<string> #include<cstring> #include<cmath> #include<algorithm>//非递归 using namespace std; int a[1000]; int q = 0; int flag = 0; typedef struct BiTNode { int data; struct BiTNode *lchild, *rchild; int count; }BiTNode,*BiTree; void InsertBST(BiTree &T,int e) { BiTNode *cur=T; BiTree s = new BiTNode; s->data = e; s->count = 0; s->lchild = NULL; s->rchild = NULL; if (!T) { T = s; } else { BiTNode *parent=T; while (cur != NULL) { parent = cur; if (e > parent->data) cur = parent->rchild; else if (e < parent->data) cur = parent->lchild; else if (e == parent->data) { parent-

二叉排序树

早过忘川 提交于 2019-12-05 05:01:56
目录 二叉排序树的特点 插入操作(构造排序树) 查找 删除结点 完整代码: 二叉排序树的特点 若左子树不空,则左子树所有结点值均小于根结点 若右子树不空,则右子树所有结点值均大于根结点 二叉树排序树的中序遍历结果即为元素的升序序列 插入操作(构造排序树) Status InsertBST(BiTree *T,TElemType e) { if((*T)==NULL) { (*T)=(BiTree)malloc(sizeof(BiTNode)); (*T)->lchild=(*T)->rchild=NULL; (*T)->data=e; return TRUE; } if(e<(*T)->data)//小于根结点时,插入到左子树 InsertBST(&(*T)->lchild, e); else//大于根结点时,插入到右子树 InsertBST(&(*T)->rchild, e); return FALSE; } 通过插入构造二叉排序的过程,就相当于递归方式先序遍历二叉树的过程; 查找 指针p返回指向元素所在结点的指针,指针f始终指向*p的双亲结点 Status SearchBST(BiTree T,TElemType key,BiTree f ,BiTree *p) { if(!T) { *p=f; printf("查找失败\n"); return FALSE; } else if

作业九

你离开我真会死。 提交于 2019-12-05 00:51:01
20182302 2019-2020-1 《数据结构与面向对象程序设计》第8周学习总结 教材学习内容总结 **二叉排序树* 1、平均编码长度:各字符编码长度Li与出现概率Pi之积求和 2、平均编码长度短的有更好性能 3、编码:概率大的编码短,概率小编码长 4、树的带权路径长度 5、最优二叉树/哈夫曼树:带权路径长度最小的二叉树。在哈夫曼书中,带权值越短的 6、构造哈夫曼树 7、已知的最佳无损解压算法 二叉查找树:即用循环寻找要找的元素,原理简单,注意:二叉树有一共同特点,即先确定左子树,再确定右函数。 二叉树删除:删除要分三种情况 (1)删除叶子结点:直接找到到删除的节点的父节点,使父节点的相应左右子树等于null。 用子节点代替他。 (2)删除含一个子结点的结点(左或右):直接用子节点代替他。 (3)删除含左右两个结点的结点:此种类最为复杂,我的方案是先将树中序遍历,取待删除结点前面的一个元素,再在树中寻找这个结点。将这个结点删除,再将待删结点的值改为先前找到的值。 树 树的遍历: (1)先序遍历:先访问根,再访问左右子树。 (2)中序便利:先遍历左子树,再访问根节点,再访问右子树。 (3)后序遍历:先便利左子树,再遍历右子树,最后遍历根节点。 树的分类: 一种是树中任一结点可以具有的最大孩子数目。这个值有时称为该树的度。所含孩子无限为广义树

求结点在二叉排序树中层次的算法

纵然是瞬间 提交于 2019-12-04 15:59:27
求结点在二叉排序树中层次的算法 1 typedef struct node{ 2 int key; 3 struct node *lchild,*rchild; 4 }bitree; 5 int lev=0; 6 void level(bitree *bt,int x) 7 { 8 if(bt!=null){ 9 lev++; 10 if(bt->key==x) return; 11 else if(bt->key>x) level(bt->lchild,x); 12 else level(bt->rchild,x); 13 } 14 } 来源: https://www.cnblogs.com/shixinzei/p/11872700.html

java - 数据结构 - 二叉排序树

十年热恋 提交于 2019-12-04 11:56:39
二叉排序树(BST) 任何一个节点, 左边的节点值都比他小,右边的都比他大,中序遍历得到的是从小到大的数列。 可以用来排序和快速查找。 1. 添加 从根节点向下寻找,比当前节点小就向左,比当前节点大就向右,直到最低端,然后称为新的叶子节点(没有孩子节点的节点)。 2. 查询 从根节点向下寻找,比当前节点小就向左,比当前节点大就向右,相等时就找到了 3. 删除(主要难点) 3种情况 1. 没有孩子节点 叶子节点可以直接删掉,用null代替其原来位置 2. 有一个孩子 用孩子节点代替自己。 3. 有两个孩子 用右孩子的最小叶子节点,或者左孩子的最大叶子节点代替自己,然后删掉那个叶子节点 本质就是找个跟自己中序遍历时挨着的节点代替自己,这样不会影响整体结构。 平衡二叉树(以后再整理=。=)的继承节点是找自己右孩子的左叶子节点,所以这里就用右孩子的左叶子节点代替了。 package tree; public class BinarySortTree { Node root; public BinarySortTree(){ root = null; } //添加节点 public void add(int num){ if(root == null) { root = new Node(num); } else{ Node n = new Node(num); root.add(n); }

二叉排序树-插入算法

雨燕双飞 提交于 2019-12-04 08:44:30
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 typedef struct BTNode{ 5 int key; 6 BTNode *lchild; 7 BTNode *rchild; 8 }BTNode; 9 10 int BSTInsert(BTNode *&p,int key)//用返回值判断插入是否成功 11 { 12 if(p==NULL) 13 { 14 p=(BTNode*)malloc(sizeof(BTNode)); 15 p->key=key; 16 p->lchild=p->rchild=NULL; 17 return 1;//成功插入 18 } 19 else 20 { 21 if(p->key==key) return 0;//已经存在相同值的结点,插入失败 22 else 23 { 24 if(key < p->key) 25 { 26 return BSTInsert(p->lchild,key);//去左子树 27 } 28 if(key > p->key) 29 { 30 return BSTInsert(p->rchild,key);//去右子树 31 } 32 } 33 } 34 } 35 int DFS(BTNode*p,int maxSize) 36 { 37 int front,rear;

二叉排序树查找递归 非递归

我与影子孤独终老i 提交于 2019-12-03 02:41:38
算法思想 首先将待查关键字key与根结点关键字t进行比较,如果: 1)key=t,则返回根结点地址; 2)key<t,则进一步查找左子树; 3)key>t,则进一步查找右子树; 对应的递归算法如下: BSTree SearchBST(BSTree bst, ElemType key) { if (!bst) return NULL; else if (bst->key == key) return bst; else if (bst->key > key) return SearchBST(bst->lchild, key); else return SearchBST(bst->rchild, key); } 对应的非递归算法如下: BSTNode *BST_Search(Bitree T, ElemType key, BSTNode *&p) { p = NULL;//p指向待查找结点的双亲,用于插入和删除操作中 while(T!=NULL&&key!=T->data){ if (key < T->data) T = T->lchild; else T = T->rchild; } } 来源: https://www.cnblogs.com/brainstorm-yc/p/11774390.html

数据结构(三十八)平衡二叉树(AVL树)

匿名 (未验证) 提交于 2019-12-03 00:40:02
  一、平衡二叉树的定义   平衡二叉树(Self-Balancing Binary Search Tree或Height-Balanced Binary Search Tree),是一种二叉排序树,其中每一个结点的左子树和右子树的高度差至多等于1。平衡二叉树是一种高度平衡的二叉排序树,即要么是一棵空树,要么它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。   将二叉树上结点的左子树深度减去右子树深度的值称为平衡因子BF(Balance Factor),那么平衡二叉树上所有结点的平衡因子只可能是-1、0和1。   距离插入结点最近的,且平衡因子的绝对值大于1的结点为根的子树,称为最小不平衡树。      二、平衡二叉树的实现原理   平衡二叉树构建的基本思想就是在构建二叉排序树的过程中,每当插入一个结点时,先检查是否因插入破坏了树的平衡性,若是,则找出最小不平衡树。在保持二叉排序树特性的前提下,调整最小不平衡树中各结点之间的链接关系,进行相应的旋转,使之成为新的平衡子树。   以数组{3,2,1,4,5,6,7,10,9,8}为例:            注意的是: 图6到图7,对结点2进行左旋,本来结点3是结点4的左孩子,由于旋转后需要满足二叉排序树的特定,因此结点3最后成了结点2的右孩子。 另外,图11中, 如果对结点7进行左旋的话

数据结构之二叉排序树的建立

匿名 (未验证) 提交于 2019-12-03 00:27:02
一、普通二叉树的建立 提到二叉树的建立,就不得不提一下“递归”,建立二叉树所采用的思想就是递归。 递归基本形式: void recursion () { if (递归结束条件) { 表达式 } else { 表达式; recursion (); } } 有了递归思想后,我们如何建立二叉树呢?比如建立如图的二叉树: 问题:发现此二叉树并不是完全二叉树,有的只有右孩子没有左孩子,这样的话,可以在输入时人为的假定一个虚拟的空孩子比如用65535表示空结点,具体如下: 代码实现: /*****************普通二叉树的建立与遍历************/ void CreateBiTree ( tNode * T ) /*二叉树的建立*/ { int ch ; scanf ( "%d" , & ch ); if ( 0 == ch ) * T = NULL ; else { * T = ( tNode ) malloc ( sizeof ( node )); if (!* T ) exit ( OVERFLOW ); (* T )-> data = ch ; CreateBiTree (&(* T )-> lchild ); //构造左子树 CreateBiTree (&(* T )-> rchild ); //构造右子树 } } 二、二叉排序树的建立