二叉搜索树、平衡二叉树

-二叉搜索树

查找问题:静态查找和动态查找,静态查找可以用二分查找-判定树,那么针对动态查找数据如何组织?
(树的动态性强 比线性方便)
二叉搜索树(BST,Binary Search Tree)也称二叉排序树或二叉查找树
一棵二叉树满足以下性质:
1.非空左子树的所有键值小于其根结点的键值
2.非空右子树的所有键值大于其根结点的键值
3.左、右子树都是二叉搜索树

-二叉树的特殊函数:

二叉搜索树的查找操作(找出指定元素):Find
Position Find ( ElementType X, BinTree BST )
{
if ( ! BST ) return NULL ; // 查找失败
if ( X > BST -> Data )
return Find ( X, BST -> Right ); // 在右子树中继续查找
Else if ( x < BST -> Data )
return Find ( x, BST -> Left ); // 在左子树中继续查找
else // X == BST -> Data
return BST; // 查找成功,返回找到结点的地址
}

上述算法运用到递归且都是尾递归,即在程序最后要返回时才递归,从编译角度看,尾递归可以用循环实现。
前文提到非递归函数执行效率更高,所以将“尾递归”函数改为迭代函数:
Position Find ( ElementType X, BinTree BST )
{
while ( BST ) {
if ( X > BST -> Data )
BST = BST -> Right; // 向右子树移动并查找
else if ( X < BST -> Data )
BST = BST -> Left; // 向左子树移动并查找
else // X == BST -> Data
return BST; // 查找成功,返回结点地址
}
return NULL; // 查找失败
}
查找效率决定于树的高度
查找最大值和最小值,即最左结点和最右结点

-二叉搜索树的插入

关键是找到元素应该插入的位置,可以采用与Find函数相似的方法,

BinTree Insert ( ElementType X, BinTree BST )
{
if ( ! BST ) {
// 若带插入的二叉搜索树为空树,则生成并返回只有一个结点的二叉搜索树;若带插入的二叉搜索树不为空树,则代表已经找到了应该插入的位置,就在该位置插入指定的元素
BST = malloc ( sizeof ( struct TreeNode ) );
BST -> Data = X;
BST -> Left = BST -> Right = NULL;
} else // 开始查找应该插入的位置
if ( X < BST -> Data )
BST -> Left = Insert ( X, BST -> Left ); // 递归插入左子树
Else if ( x > BST -> Data )
BST -> Right = Insert ( X, BST -> Right ); // 递归插入右子树
return BST; // else X已存在 什么都不用做
}

-二叉搜索树的删除

要考虑三种情况:
1.要删除的是叶结点:直接删除 并修改其父结点指针 值为NULL
2.要删除的结点只有一个子结点:将其父结点的指针指向要删除结点的孩子结点
3.最复杂的情况,要删除的结点有左右两棵子树,用另一结点替代被删除结点:右子树的最小元素或者左子树的最大元素,即将该情况转换为前面两种情况,右子树的最小元素或者左子树的最大元素必然是叶结点或者只有一个子结点的结点 要删除它们是比较方便的

BinTree Delete ( ElementType X, BinTree BST )
{
Position Tmp ;
if ( ! BST ) printf ( “要删除的元素未找到” ) ;
else if ( X < BST -> Data )
BST -> Left = Delete ( X, BST -> Left ); // 左子树递归删除
else if ( x > BST -> Data )
BST -> Right = Insert ( X, BST -> Right ); // 右子树递归删除
else // 找到要删除的结点,接下来判断该结点的子结点情况
if ( BST -> Left && BST -> Right ) { // 要被删除的结点有左右两个子结点
Tmp = FindMin ( BST -> Right ) ; // 在右子树中找最小的元素填充删除结点
BST -> Data = Tmp -> Data ;
BST -> Right = Delete ( BST -> Data, BST -> Right ) ; // 在删除结点的右子树中删除最小元素
} else { // 被删除结点有一个子结点或无子结点
Tmp = BST ;
if ( !BST -> Left ) // 有右孩子活着无子结点
BST = BST -> Right ;
else if ( ! BST -> Right ) ; // 有左孩子或无子结点
BST = BST -> Left ;
free ( Tmp ) ;
}
return BST ;
}

-平衡二叉树

搜索树结点不同插入次序,将导致不同的深度和平均查找长度ASL;平均查找长度ASL=(层数*该层结点数 的和)/总结点数
平衡因子(Balance Factor):左子树的高度与右子树的高度的差
平衡二叉树(Balance Binary Tree)(AVL树):空树,或者任一结点左右子树高度差的绝对值不超过1

-平衡二叉树的调整:

当我们往平衡二叉树中插入结点后,可能导致插入后的树不平衡,这时我们需要调整
右单旋:首先找出不平衡的“发现者”(左右子树高度差大于1的结点)“麻烦结点”(插入后导致不平衡的结点)在发现者右子树的右边,因而叫RR插入,需要RR旋转(右单旋)

002WV0d1zy70G7UnqgYec&690.png

上面例子中发现者是5, 麻烦结点是15
左单旋:类似的,左单旋即“麻烦结点”在“发现者”左子树的左边,因而叫LL插入,需要LL旋转(左单旋)

LR旋转:“麻烦结点”在“发现者”左子树的右边,因而叫LR插入,需要LR旋转

002WV0d1zy70G7WoqyN55&690.jpeg

RL旋转:“麻烦结点”在“发现者”右子树的左边,因而叫RL插入,需要RL旋转

002WV0d1zy70G7XVR2ce4&690.jpeg
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容