树的遍历、平衡二叉树实现
来源:互联网 发布:网络监控服务器 编辑:程序博客网 时间:2024/05/22 11:47
代码内容来自《大话数据结构》,程杰著。
原书中没有RightBalance函数实现,本处按照LeftBalance实现。
#include <stdio.h>#include <stdlib.h>#define LH +1 //左高#define EH 0 //相等#define RH -1 //右高typedef struct BitNode {int data;//结点数据int bf;//结点平衡因子struct BitNode * lchild, *rchild;}BitNode, *pBitNode;typedef enum {FALSE, TRUE} Status;//右旋转void R_Rotate(pBitNode * p) {pBitNode L;L = (*p)->lchild;(*p)->lchild = L->rchild;L->rchild = (*p);*p = L;}//左旋转void L_Rotate(pBitNode * p) {pBitNode R;R = (*p)->rchild;(*p)->rchild = R->lchild;R->lchild = (*p);*p = R;}//左平衡调节void LeftBalance(pBitNode *T) {pBitNode L, Lr;L = (*T)->lchild;switch (L->bf){//情况2case LH: {(*T)->bf = L->bf = EH;R_Rotate(T);}break;//情况1case RH: {Lr = L->rchild;switch (Lr->bf){case LH:{(*T)->bf = RH;L->bf = EH;}break;case EH:{(*T)->bf = L->bf = EH;}break;case RH:{(*T)->bf = EH;L->bf = LH;}break;}Lr->bf = EH;L_Rotate(&(*T)->lchild);R_Rotate(T);}break;}}void RightBalance(pBitNode *T) {pBitNode R, Rl;R = (*T)->rchild;switch (R->bf){case RH: {(*T)->bf = R->bf = EH;L_Rotate(T);}break;case LH: {Rl = R->lchild;switch (Rl->bf){case RH:{(*T)->bf = LH;R->bf = EH;}break;case EH:{(*T)->bf = R->bf = EH;}break;case LH:{(*T)->bf = EH;R->bf = RH;}break;}Rl->bf = EH;R_Rotate(&(*T)->rchild);L_Rotate(T);}break;}}Status InsertAVL(pBitNode *T, int e, Status *taller) {//空节点if (!*T) {*T = (pBitNode)malloc(sizeof(BitNode));(*T)->data = e;(*T)->lchild = (*T)->rchild = NULL;(*T)->bf = EH;*taller = TRUE;return TRUE;}//已经存在和e有相同关键字结点if (e == (*T)->data) {*taller = FALSE;return FALSE;}//插入结点if (e < (*T)->data) {if (!InsertAVL(&(*T)->lchild, e, taller)) {return FALSE;}if (*taller) {switch ((*T)->bf) {case LH:LeftBalance(T);*taller = FALSE;break;case EH:(*T)->bf = LH;*taller= TRUE;break;case RH:(*T)->bf = EH;*taller = FALSE;break;}}}else {if (!InsertAVL(&(*T)->rchild, e, taller)) {return FALSE;}if (*taller) {switch ((*T)->bf) {case RH:RightBalance(T);*taller = FALSE;break;case EH:(*T)->bf = RH;*taller= TRUE;break;case LH:(*T)->bf = EH;*taller = FALSE;break;}}}return TRUE;}//先根遍历void PreOrderTraverse(pBitNode T) {if (T == NULL) {return;}printf("%d",T->data);PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}//中根遍历void MidOrderTraverse(pBitNode T) {if (T == NULL) {return;}MidOrderTraverse(T->lchild);printf("%d",T->data);MidOrderTraverse(T->rchild);}//后根遍历void LastOrderTraverse(pBitNode T) {if (T == NULL) {return;}LastOrderTraverse(T->lchild);LastOrderTraverse(T->rchild);printf("%d",T->data);}void main() {int i;int a[10] = {3,2,1,4,5,6,7,10,9,8};Status taller;pBitNode T=NULL;for (i=0; i<10; i++) {InsertAVL(&T, a[i], &taller);PreOrderTraverse(T);printf(" ");MidOrderTraverse(T);printf(" ");LastOrderTraverse(T);printf("\n");}}
LeftBalance用于处理以下两种情况:
情况1: 情况2:
调整后结果:
情况1之所以在代码中存在两次旋转,是因为情况1需要首选左旋为情况2,后再右旋才能达到最后的调整结果。
RightBalance正好处理与LeftBalance相反情况。
0 0
- 树的遍历、平衡二叉树实现
- 平衡二叉树的实现 操作 遍历
- 平衡二叉树(遍历,插入,删除)的C实现
- hdu5444(平衡二叉树+树的遍历)
- 平衡二叉树的实现
- 平衡二叉树的实现
- 平衡二叉树的实现
- 平衡二叉树 实现
- 平衡二叉树实现
- 实现平衡二叉树
- 平衡二叉树实现
- 平衡二叉树的建立,查找,插入,调整,遍历的C语言实现
- 二叉排序树,平衡二叉树,Treap平衡树的实现-转帖
- 二叉平衡树树的实现
- 平衡二叉树---AVL树的实现
- 平衡二叉树的完整实现
- 平衡二叉树插入的实现
- 平衡二叉树的java实现
- RFID系统二进制树型搜索算法是如何解决碰撞的?简述其实现步骤
- 散列(2)线性探测法和双重散列法
- Qt for Android - ANT_HOME is set incorrectly or ant could not be located
- Wireless Network(POJ-2236)(并查集)
- 第2章 8
- 树的遍历、平衡二叉树实现
- robotframework如何提取失败的测试,以便下次运行
- 垃圾收集器与内存分配策略
- 向文件中写入时文件中没有任何内容
- 第四章实验第三题
- XUtil学习之DBUtil(十一)
- Reachability(判断网络是否连接)
- ELF格式文件符号表全解析及readelf命令使用方法
- linux下基于opencv的摄像机标定与重投影