- 浏览: 1476566 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (691)
- linux (207)
- shell (33)
- java (42)
- 其他 (22)
- javascript (33)
- cloud (16)
- python (33)
- c (48)
- sql (12)
- 工具 (6)
- 缓存 (16)
- ubuntu (7)
- perl (3)
- lua (2)
- 超级有用 (2)
- 服务器 (2)
- mac (22)
- nginx (34)
- php (2)
- 内核 (2)
- gdb (13)
- ICTCLAS (2)
- mac android (0)
- unix (1)
- android (1)
- vim (1)
- epoll (1)
- ios (21)
- mysql (3)
- systemtap (1)
- 算法 (2)
- 汇编 (2)
- arm (3)
- 我的数据结构 (8)
- websocket (12)
- hadoop (5)
- thrift (2)
- hbase (1)
- graphviz (1)
- redis (1)
- raspberry (2)
- qemu (31)
- opencv (4)
- socket (1)
- opengl (1)
- ibeacons (1)
- emacs (6)
- openstack (24)
- docker (1)
- webrtc (11)
- angularjs (2)
- neutron (23)
- jslinux (18)
- 网络 (13)
- tap (9)
- tensorflow (8)
- nlu (4)
- asm.js (5)
- sip (3)
- xl2tp (5)
- conda (1)
- emscripten (6)
- ffmpeg (10)
- srt (1)
- wasm (5)
- bert (3)
- kaldi (4)
- 知识图谱 (1)
最新评论
-
wahahachuang8:
我喜欢代码简洁易读,服务稳定的推送服务,前段时间研究了一下go ...
websocket的helloworld -
q114687576:
http://www.blue-zero.com/WebSoc ...
websocket的helloworld -
zhaoyanzimm:
感谢您的分享,给我提供了很大的帮助,在使用过程中发现了一个问题 ...
nginx的helloworld模块的helloworld -
haoningabc:
leebyte 写道太NB了,期待早日用上Killinux!么 ...
qemu+emacs+gdb调试内核 -
leebyte:
太NB了,期待早日用上Killinux!
qemu+emacs+gdb调试内核
转http://www.cnblogs.com/fornever/archive/2011/11/15/2249492.html
一句话,出来混,早晚是要还的,天天弄java,mlgbd基础全忘光了
一句话,出来混,早晚是要还的,天天弄java,mlgbd基础全忘光了
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef int Elemtype; typedef struct Balanced_Binary_Tree { Elemtype e; int bf; struct Balanced_Binary_Tree *child[2]; }*AVL; ///------------简单的位操作------------------- void setbit(char *i,char val,char pos) { if(pos==1) (*i)=(*i)|1; else { if(val==1) (*i)=(*i)|2; else (*i)=(*i)&1; } } char getbit(char i,char pos) { ///调试时,发现这里能返回2/// // return (i&pos); 出错的地方 return (i&pos)&&1; ///////////////////////////// } ///-------------------------------------------- ///-----------生成一个结点--------------------- AVL createnode(Elemtype e) { AVL node=NULL; node=(AVL)malloc(sizeof(struct Balanced_Binary_Tree)); node->e=e; node->bf=0; node->child[0]=node->child[1]=NULL; return node; } ///--------------------------------------------- ///★★★★★★★★AVL的核心操作★★★★★★★★★★★★ ///★★★★★★★★★保持平衡★★★★★★★★★★★★★★ //改变因子函数 void setfactor(AVL f,int button) { char fir=button/10,sec=button%10; AVL s=f->child[fir],ss=s->child[sec]; char choice=ss->bf; int a=1,b=0; //////////调试时发现,删除时的特殊情况///////////// /////插入时,不会有这种情况,若button=0,则s->bf=1// /////若button=11,则s->bf=-1;然而删除时,却会出现/ /////button=0或者button=11时 s->bf=0!!!!!!!//////// /////那么这种特殊情况,平衡后所得的因子就跟一般的// /////不一样了!!!如下/////////////////////////////// if(button==0 && s->bf==0) f->bf=1,s->bf=-1; else if(button==11 && s->bf==0) f->bf=-1,s->bf=1; /////////////////////////////////////////////////// else if(button==0 || button==11) { f->bf=0; s->bf=0; } else { /////写博客时,发现这里有问题/////////////////// // if(button==1) choice=-choice; /////但是为什么我测试的时候怎么都对?!/////////// /////经再次测试,上边确实错了!!!//////////////// /////改为下边应该就对了吧/////////////////////// if(button==1) {a^=b,b^=a,a^=b;} //////////////////////////////////////////////// if(choice==-1) f->bf=a,s->bf=b; else if(choice==0) f->bf=s->bf=0; else f->bf=-b,s->bf=-a; ss->bf=0; } } //两节点变换函数 void conversion(AVL *T,char direction) { AVL f=*T,s=f->child[direction]; f->child[direction]=s->child[!direction]; s->child[!direction]=f; *T=s; } //保持平衡函数 void keepbalance(AVL *T,char fir,char sec) { AVL *s=&((*T)->child[fir]); int button=fir*10+sec; if(button==0 || button==11) { setfactor((*T),button); conversion(T,fir); } else { setfactor((*T),button); conversion(s,sec); conversion(T,fir); } } ///★★★★★★★★★★★★★★★★★★★★★★★★★★ ///------------插入时的选向操作------------------- void selectforInsert(AVL *T,char *info,int direction) { AVL cur=*T; char firdirection,secdirection; if(direction==0) (cur->bf)++; else (cur->bf)--; if(cur->bf==0) setbit(info,1,1); else if(cur->bf==-1 || cur->bf==1) setbit(info,direction,2); else { firdirection=direction; secdirection=getbit(*info,2); keepbalance(T,firdirection,secdirection); setbit(info,1,1); } } //---------------------------------------------- //*************插入操作************************// char InsertAVL(AVL *T,Elemtype e) { //可用于查询 char info; if(!(*T)) { (*T)=createnode(e); return 0; } else if((*T)->e==e) return -1; else if((*T)->e>e)//左 { info=InsertAVL(&((*T)->child[0]),e); if(getbit(info,1)) return info; selectforInsert(T,&info,0); } else //右 { info=InsertAVL(&((*T)->child[1]),e); if(getbit(info,1)) return info; selectforInsert(T,&info,1); } return info; } //*********************************************// //-------------删除时的选向操作-------------------- void selectforDelete(AVL *T,char *info,char direction) { AVL cur=(*T); char firdirection,secdirection; if(direction==0) (cur->bf)--; else (cur->bf)++; if(cur->bf==0) *info=0; else if(cur->bf==-1 || cur->bf==1) *info=1; else { firdirection=!direction; ///调试时,发现这里少写了一个等号//////////////////// // if(cur->child[firdirection]->bf=1) secdirection=0;草,真帅气!原来1==a这样写确实有必要! if(1==cur->child[firdirection]->bf) secdirection=0; ///////////////////////////////////////////////////// else secdirection=1; keepbalance(T,firdirection,secdirection); ///////////////////////////////////////////////////////////////////////////////////////// ///调试时,发现经过子树平衡操作后,*info不一定都是0,就是那个特殊情况,在setfactor中///// ///的那种特殊情况时,这里*info应改为1! 所以代码改如下:////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////// // *info=1; 写代码时:这跟插入可不一样啊...该子树平衡了,它父节点的因子比变! // *info=0;//因此,这还没完还要是0!! ............啊……这里不一定是0! ////还是那个特殊情况搞的鬼!// if(cur->bf==0) *info=0; else *info=1; ///////////////////////////////////////////////////////////////////////////////////////// } } //------------------------------------------------ //-------------变向递归--辅助删点----------------- char find(AVL *gogal,AVL *p) { char info; AVL tp=NULL; if(NULL!=(*p)->child[0]) { info=find(gogal,&((*p)->child[0])); if(info!=0) return info; selectforDelete(p,&info,0); } else { (*gogal)->e=(*p)->e; tp=(*p)->child[1]; free((*p)); *p=tp; info=0; } return info; } //------------------------------------------------ //**************删除操作*************************// char DeleteAVL(AVL *T,Elemtype e) { char info; AVL tp=NULL; if(!(*T)) return -1;//原if(!T) return -1;于2011年11月29日8:59:15修改 else if((*T)->e==e) { if(NULL!=(*T)->child[1]) { info=find(T,&((*T)->child[1])); if(info!=0) return info; selectforDelete(T,&info,1); } else { //////////////调试时,发现这样写不对!!!/////////////////////////////////////// // (*T)=(p=(*T)->child[0])-(free((*T)),0);//Just save a variable! 这里出问题 // (*T)=p-(free((*T)),0); 可以 // (*T)=(p=((*T)->child[0]))+(free((*T)),0); 不可以 tp=((*T)->child[0]); free((*T)); *T=tp; //调试时,发现这里漏了给info赋值 info=0; /////////////////////////////////////////////////////////////////////////////// } } else if((*T)->e>e) { info=DeleteAVL(&(*T)->child[0],e); if(info!=0) return info; selectforDelete(T,&info,0); } else { info=DeleteAVL(&(*T)->child[1],e); if(info!=0) return info; selectforDelete(T,&info,1); } return info; } //************************************************// //*****************JUST FOR TEST************************// #define MOVE(x) (x=(x+1)%1000) AVL queue[1000]; void print(AVL p,int i) { int front,rear,temp,count; front=rear=-1; count=temp=0; queue[MOVE(rear)]=p; count++; printf("%d\n",i); while(front!=rear) { p=queue[MOVE(front)]; count--; if(p->child[0]) queue[MOVE(rear)]=p->child[0],temp++; if(p->child[1]) queue[MOVE(rear)]=p->child[1],temp++; printf("%d->%d ",p->e,p->bf); if(count==0) { printf("\n"); count=temp; temp=0; } } printf("\n"); } //**************************************************// int main() { AVL T=NULL; int i,nodenum=0; freopen("input.txt","w",stdout); nodenum=100; for(i=0;i<nodenum;i++) { InsertAVL(&T,i); } print(T,-1); for(i=0;i<nodenum-1;i++) { DeleteAVL(&T,i); print(T,i); } return 0; }
发表评论
-
weak_ptr解决循环引用问题
2021-03-08 21:12 1170C++11引入的三种智能指 ... -
gcc链接顺序
2019-10-12 18:25 630代码在 https://github.com/killinux ... -
c++11的function和bind
2019-09-10 16:12 532参考:https://www.cnblogs.co ... -
opengl的helloworld
2014-10-22 19:41 9021.我提供一个不需要配置环境就可运行的源码。 glut.h放在 ... -
画图板用c++实现和用js实现的websocket版本
2014-10-17 13:02 2128画图板 opencv的c++ #include <o ... -
c语言内存
2014-07-02 10:26 6941、C中内存分为五个区 栈:用来存放函数的形参和函数内的局部变 ... -
重定向stdout到文件
2014-03-05 18:37 5483把stdout重定向到文件 两种方法: 第一种方法没有恢复 ... -
通过nginx远程执行shell
2014-03-03 10:26 5083saltstack远程执行shell,远程管理等返回json已 ... -
c的urldecode
2014-02-28 18:22 1363#include <stdio.h> #in ... -
pthread的pthread_mutex_lock 的使用
2014-02-25 16:54 26142参考http://haoningabc.iteye.com/b ... -
c调用c++
2013-10-12 15:24 1177参考 http://www.cppblog.com/frank ... -
用C语言,实现接收管道输出的结果,并显示
2013-04-23 21:35 1945在shell里利用“|”管道干的事情就是io重定向,把“|”命 ... -
关于char * 与 char[]
2013-04-22 21:56 960问题引入: 在实习过程中发现了一个以前一直默认的错误,同样ch ... -
单向链表翻转
2012-12-25 23:41 1019临时笔记,创建一个链表 #include <stdl ... -
trie 树 的代码
2012-12-14 23:20 1139想起搜狐老大的一句话 看代码先看h文件,擦,当初感觉他这句话很 ... -
指针函数与函数指针的区别
2012-12-14 22:44 1195一、 1、指针函数是指带指针的函数,即本质是一个函数。函数返回 ... -
指针和数组
2012-11-14 22:40 1066转载http://kan.weibo.com/con/3512 ... -
js备份
2012-10-31 23:56 1724<!DOCTYPE HTML PUBLIC " ... -
线程的helloworld
2012-10-30 21:51 1603#include<stdio.h> #inc ... -
c的书籍
2012-10-30 10:56 1128http://www.acm.uiuc.edu/webmonk ...
相关推荐
二叉树是一种在计算机科学中广泛应用的数据结构,它由节点(也称为结点)组成,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的深度是指从根节点到最远叶节点的最长路径上边的数目,即树的最大层数...
二叉树是一种特殊的树结构,每个节点最多只有两个子节点,通常分为左子节点和右子节点。在计算机科学中,二叉树被广泛应用于数据的组织和操作,如搜索、排序、文件系统等。本例子关注的是如何实现二叉树的图形显示,...
在计算机科学领域,二叉树是一种基础的数据结构,它由结点构成,每个结点最多有两个子节点,分别称为左子节点和右子节点。在众多的二叉树操作中,根据后序遍历序列(也称为后序序列)来构造二叉树是一项常见的任务。...
(2)先序、中序、后序遍历二叉树:递归算法。 (3)中序遍历二叉树:非递归算法(最好也能实现先序,后序非递归算法)。 (4)求二叉树的高度 。 (5)求二叉树的叶子个数。 (6)对于树中每一个元素值为x的结点...
- **答案解析**:如果一棵二叉树的中序遍历序列和后序遍历序列正好相反,那么该二叉树一定是任一结点都没有左孩子的二叉树。 #### 5. 二叉树的结点数范围 - **答案解析**:深度为k的二叉树最多有\(2^k - 1\)个结点...
在IT领域,特别是数据结构和算法的学习中,二叉树是一种重要的抽象数据类型。满二叉树是一种特殊的二叉树,其中每一层都是完全填充的,除了可能的最后一层,且最后一层的所有节点都尽可能地向左靠拢。而将满二叉树...
根据给定的信息,本文将详细介绍二叉树的基本概念及其在程序中的实现方法,包括二叉树的创建、遍历(前序、中序、后序)、复制、求高度、判断是否为完全二叉树以及利用二叉树进行表达式的计算等操作。 ### 一、...
### 构造二叉树与遍历二叉树 #### 一、二叉树的基本概念 二叉树(Binary Tree)是一种非线性数据结构,在计算机科学中被广泛应用于各种算法和程序设计中。一个二叉树由零个或多个节点组成,其中每个节点最多有两个子...
二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...
### 知识点:复制一棵二叉树 #### 一、引言 在计算机科学领域,数据结构中的二叉树是一种常见的非线性数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。复制二叉树是指创建一个与原...
建立一棵二叉树,试编程实现二叉树的如下基本操作: 1. 按先序序列构造一棵二叉链表表示的二叉树T; 2. 对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出结点的遍历序列; 3. 求二叉树的深度/结点数目...
1、 定义链接存储的二叉树类。 2、 实验验证如下算法的正确性、各种功能及指标: 1) 创建一棵二叉树,并对其初始化; 2)先根、中根、后根遍历二叉树; 3) 在二叉树中搜索给定结点的父结点; 4) 搜索二叉树中符合...
二叉树的建立与遍历 二叉树是一种重要的数据结构,它广泛应用于计算机科学和软件工程中。在这篇文章中,我们将讨论二叉树的建立和遍历,包括先序遍历、中序遍历和后序遍历。 一、数据结构的重要性 数据结构是...
1.二叉树的基本操作实现【问题描述】建立一棵二叉树,用递归方法实现二叉树的如下基本操作:(1)按先序序列构造一棵二叉链表表示的二叉树T;(2)对这棵二叉树进行遍历:先序、中序、后序以及层次遍历,分别输出...
### 二叉树树形输出知识点解析 #### 一、二叉树基本概念 二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。在计算机科学中,二叉树经常被用于实现各种算法和数据结构,如搜索...
二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py二叉树模拟器.py...
### 二叉树基本操作知识点解析 #### 一、实验目的 在本实验中,学习者将通过实际编程练习来加深对二叉树这一数据结构的理解,并熟练掌握其基本操作。具体目标包括: 1. **熟悉二叉树结点的结构和对二叉树的基本...
### 二叉树遍历实验报告知识点概览 #### 一、实验背景及目标 **实验背景:** 本次实验属于《数据结构》课程的一部分,旨在通过实际编程加深学生对二叉树这一数据结构的理解和应用能力。二叉树作为一种基本且重要的...