日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

AVL添加平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。-icoding-数据结构-C-typedef struct node{ int val;

發(fā)布時(shí)間:2023/12/4 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 AVL添加平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。-icoding-数据结构-C-typedef struct node{ int val; 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

AVL添加


平衡二叉樹,是一種二叉排序樹,其中每個(gè)結(jié)點(diǎn)的左子樹和右子樹的高度差至多等于1。
它是一種高度平衡的二叉排序樹。現(xiàn)二叉平衡樹結(jié)點(diǎn)定義如下:

typedef struct node {int val;struct node *left;struct node *right;struct node *parent;int height; } node_t;

請(qǐng)實(shí)現(xiàn)平衡二叉樹的插入算法:

向根為 root 的平衡二叉樹插入新元素 val,成功后返回新平衡二叉樹根結(jié)點(diǎn)

node_t *avl_insert(node_t *root, int val);#include <stdlib.h> #include <stdio.h> #include "avl.h"int get_height(node_t *p){if(!p)return 0;elsereturn p->height; }

示例代碼如下:

一定要超級(jí)仔細(xì), 不然絕對(duì)后悔!

node_t* avl_insert(node_t *root, int val){ //首先清晰字母定義; //val新插入結(jié)點(diǎn)元素值,height高度!!! //定義查找過程中出現(xiàn)的距離插入結(jié)點(diǎn)最近的平衡因子不為零的結(jié)點(diǎn)A //定義A的孩子結(jié)點(diǎn)為B,需要旋轉(zhuǎn)的結(jié)點(diǎn) //定義插入節(jié)點(diǎn)為s,s的值為val //平衡因子:左子樹減去右子樹深度 node_t *s, *A, *B, *C, *p, *fp;//依次:插入點(diǎn), 失衡點(diǎn)(也可能是旋轉(zhuǎn)點(diǎn)),旋轉(zhuǎn)點(diǎn),旋轉(zhuǎn)點(diǎn)(也可能是插入點(diǎn)=s),動(dòng)點(diǎn),跟蹤點(diǎn)int i, k;//平衡因子 s = (node_t *)malloc(sizeof(node_t));if(!s) return NULL;s->val = val;s->left = s->parent = s->right = NULL;s->height = 1;//類似于指針跟蹤技術(shù),p為動(dòng)指針,A為跟蹤指針 A = root; A->parent = NULL;p = root; p->parent = NULL;//找出A if(!p)root = s;else{while(p){//先找出最近的A->height!=0的結(jié)點(diǎn), 就是最后的失衡點(diǎn)i = get_height(p->left) - get_height(p->right); if(i){A = p;A->parent = p->parent;}//fp跟蹤p,因?yàn)橄乱徊絧會(huì)往下移動(dòng),p最終指向s的那一層 fp = p;if(val < p->val)p = p->left;elsep = p->right;}//p最終指向NULL就推出循環(huán) } //插入, 此時(shí)fp是p的前一個(gè)結(jié)點(diǎn),p指向空 if(val < fp->val)fp->left = s;elsefp->right = s;//確定旋轉(zhuǎn)結(jié)點(diǎn)B,修改A的平衡因子if(val < A->val)B = A->left;elseB = A->right;A->height++;//修改路徑B到s的高度, B在A的下一層 p = B; // p最終指向s, 之前指向的是s這一層,但是是空while(p != s){p->height++;if(val < p->val)p = p->left; elsep = p->right; }//最終s的高度沒有++的 //調(diào)整完高度就修改結(jié)點(diǎn)和指針, 首先需要判斷失衡類型//分為L(zhǎng)L,LR,RR,RL//結(jié)點(diǎn)A,B平衡因子在修改指針的過程中會(huì)變化,但是路徑上的結(jié)點(diǎn)不會(huì)//指針修改包括s結(jié)點(diǎn)指針和原來雙親結(jié)點(diǎn)指針 i = get_height(A->left) - get_height(A->right);k = get_height(B->left) - get_height(B->right); if(i == 2 && k == 1){//LL//B作為旋轉(zhuǎn)結(jié)點(diǎn)//先改結(jié)點(diǎn)指針, 此時(shí)s插入在B的左子樹下, 原來可以認(rèn)為B左右子樹,A右子樹均為空A->left = B->right;B->right = A;//考慮原來A結(jié)點(diǎn)的指針,改成B后相應(yīng)的指針也要改變,下面同理if(A->parent == NULL)root = B;else if(A->parent->left == A)A->parent->left = B;elseA->parent->right = B; }else if(i == -2 && k == -1){//RRA->right = B->left;B->left = A;if(A->parent == NULL)root = B;else if(A->parent->left == A)A->parent->left = B;elseA->parent->right = B; }else if(i == 2 && k == -1){//LR//此時(shí)認(rèn)為C的左右子樹空,B逆時(shí)針旋轉(zhuǎn),A順時(shí)針旋轉(zhuǎn), s插入C的左子樹或者右子樹 //如果C結(jié)點(diǎn)也是空,也就是說B右子樹空,那么直接插入C=s為B右子樹,此時(shí)A右子樹也是空的 C = B->right;B->right = C->left;A->left = C->right;C->left = B;C->right = A;if(A->parent == NULL)root = C;else if(A->parent->left == A)A->parent->left = C;elseA->parent->right = C;}else if(i == -2 && k == 1){//RL //和LR一樣,畫圖來看就好C = B->left;A->right = C->left;B->left = C->right;C->left = A;C->right = B;if(A->parent == NULL)root = C;else if(A->parent->left == A)A->parent->left = C;elseA->parent->right = C;}return root; }

?

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的AVL添加平衡二叉树,是一种二叉排序树,其中每个结点的左子树和右子树的高度差至多等于1。-icoding-数据结构-C-typedef struct node{ int val;的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。