平衡二叉树创建,左旋,右旋,左平衡和右平衡
2016-05-13 16:12
543 查看
有了上一篇的二级指针优化,平衡二叉树的左旋,右旋,左平衡和右平衡就会简单一些。强烈建议你先看一下:
http://blog.csdn.net/wsrspirit/article/details/51374117
目前代码只有创建,删除还没有加入。没有注释,不好意思。你可以找其他的博客了解~C实现
代码下载:
http://download.csdn.net/detail/wsrspirit/9519288
http://blog.csdn.net/wsrspirit/article/details/51374117
目前代码只有创建,删除还没有加入。没有注释,不好意思。你可以找其他的博客了解~C实现
#include <stdio.h> #include <stdlib.h> #include <string.h> #define LH 1 #define EH 0 #define RH -1 typedef struct tree_struct { int value; int balance; struct tree_struct *lchild; struct tree_struct *rchild; }tree_t; void for_each(tree_t *bs_tree) { if (bs_tree != NULL) { printf("value %d balance %d\n", bs_tree->value,bs_tree->balance); for_each(bs_tree->lchild); for_each(bs_tree->rchild); } } void right_rotate(tree_t **root) { tree_t *lchild = (*root)->lchild; (*root)->lchild = lchild->rchild; lchild->rchild = (*root); (*root) = lchild; } void left_rotate(tree_t **root) { tree_t *rchild = (*root)->rchild; (*root)->rchild = rchild->lchild; rchild->lchild = (*root); (*root) = rchild; } void left_balance(tree_t **root) { tree_t *lchild = (*root)->lchild; tree_t *lr = lchild->rchild; switch(lchild->balance) { case LH: (*root)->balance = lchild->balance = EH; right_rotate(root); break; case RH: switch(lr->balance) { case LH: lchild->balance = EH; (*root)->balance = RH; break; case EH: lchild->balance = (*root)->balance = EH; break; case RH: lchild->balance = LH; (*root)->balance = EH; break; } lr->balance = EH; // printf("before left_rotate\n"); // for_each(*root); left_rotate(&(*root)->lchild); // printf("before right_rotate\n"); // for_each(*root); right_rotate(root); } } void right_balance(tree_t **root) { tree_t *rchild = (*root)->rchild; tree_t *rl = rchild->lchild; switch(rchild->balance) { case RH: (*root)->balance = rchild->balance = EH; left_rotate(root); break; case LH: switch(rl->balance) { case RH: rchild->balance = EH; (*root)->balance = LH; break; case EH: rchild->balance = (*root)->balance = EH; break; case LH: rchild->balance = RH; (*root)->balance = EH; break; } rl->balance = EH; // printf("before left_rotate\n"); // for_each(*root); right_rotate(&(*root)->rchild); // printf("before right_rotate\n"); // for_each(*root); left_rotate(root); } } int insert_val(tree_t **root,int key,int *taller) { if (!(*root)) { *root = malloc(sizeof(tree_t)); (*root)->balance = EH; (*root)->lchild = (*root)->rchild = NULL; (*root)->value = key; *taller = 1; return 1; } else { if ((*root)->value == key) { *taller = 0; return 0; } else { if ((*root)->value > key) { if(insert_val(&(*root)->lchild,key,taller)) { if (*taller) { switch((*root)->balance) { case LH: printf("ll\n"); left_balance(root); *taller = 0; break; case EH: printf("le\n"); (*root)->balance = LH; *taller = 1; break; case RH: printf("lr\n"); (*root)->balance = EH; *taller = 0; break; } } return 1; } else return 0; } else { if(insert_val(&(*root)->rchild,key,taller)) { if (*taller) { switch((*root)->balance) { case LH: printf("rl\n"); (*root)->balance = EH; *taller = 0; break; case EH: printf("re\n"); (*root)->balance = RH; *taller = 1; break; case RH: printf("rr\n"); right_balance(root); *taller = 0; break; } } return 1; } else return 0; } } } } void init_val(int *a,int n,tree_t **avl_tree) { int i = 0; int taller; while(i < n) { insert_val(avl_tree,a[i],&taller); i++; } } int main(int argc, char const *argv[]) { int a[10] = {62,70,20,65,66,80,30,25,87,50}; tree_t *avl_tree; avl_tree = NULL; init_val(a,10,&avl_tree); printf("after\n"); for_each(avl_tree); return 0; }
代码下载:
http://download.csdn.net/detail/wsrspirit/9519288
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- Android ADT 23.0.0无法更新到23.0.2问题解决方案
- 如何写好 C main 函数
- C#动态创建button的方法
- Lua和C语言的交互详解
- SQLite 入门教程二 SQLite的创建、修改、删除表
- C#创建windows系统用户的方法
- PowerShell入门教程之创建和使用配置文件实例
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总