`
haoningabc
  • 浏览: 1482908 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

生成二叉树和红黑树的helloworld(1)

阅读更多
参考的这个视频
视频讲得有点烂,代码错误很多,诶,不过ptree似乎挺好,挺直观的
递归都能变成栈? 中序遍历,先序遍历,后续遍历都是栈,层序遍历用的队列


bst数的,增删
[root@VM_253_237_tlinux ~/tree]# cat bst.c  
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 10
typedef struct node *link;
struct node{
        int item;link l,r;
};
link NODE(int item,link l,link r){
        link t=malloc(sizeof *t);
        t->item=item;t->l=l;t->r=r;
        return t;
}
link insert_node(link t,int item){
        if(t==NULL) return  NODE(item,NULL,NULL);
        if(item<t->item)
                t->l=insert_node(t->l,item);
        else
                t->r=insert_node(t->r,item);
        return t;
}
void pprint(link t){
        printf("(");
        if(t!=NULL){ 
                printf("%d",t->item);
                pprint(t->l);
                pprint(t->r);
        }
        printf(")");
}
int bst_search(link t,int item){
        if(t==NULL) return 0;
        if(item<t->item)return bst_search(t->l,item);
        else if(item>t->item) return bst_search(t->r,item);
        else return 1;
}
link bst_remove(link t,int item){
        if(t==NULL) return NULL;
        if(item<t->item)
                t->l=bst_remove(t->l,item);
        else if(item>t->item){
                t->r=bst_remove(t->r,item);
        }else {
                link x;
                if(t->l){
                        for(x=t->l;x->r;x=x->r){;}
                        t->item=x->item;
                        t->l=bst_remove(t->l,t->item);
                }else if(t->r){
                        for(x=t->r;x->l;x=x->l){;}
                        t->item=x->item;
                        t->r=bst_remove(t->l,t->item);
                }else{
                        free(t);t=NULL; 
                }
        }
        return t;
}
int main(){
        srand(time(NULL));
        int i ;link root=NULL;
        for(i=0;i<N;i++) root =insert_node(root,rand()%100);
        printf("\t\\tree");pprint(root);
        printf("\n");
        printf("%d\n",bst_search(root,50));
        root=bst_remove(root,root->item);
        printf("\t\\tree");pprint(root);
        return 0;
}

---------------------------------
红黑树:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define N 10
typedef struct node *link;
struct node{
        int item,red;link l,r;
};
link null;
link NODE(int item,link l,link r,int red){
        link t=malloc(sizeof *t);
        t->item=item;t->l=l;t->r=r;t->red=red;
        return t;
}
link rotR(link t){
        link x=t->l;t->l=x->r;x->r=t;return x;
}
link rotL(link t){
        link x=t->r;t->r=x->l;x->l=t;return x;
}
void pprint(link t){
        printf("(");
        if(t!=null){ 
                printf("%d%c",t->item,t->red?'+':' ');
                pprint(t->l);
                pprint(t->r);
        }
        printf(")");
}
link RBinit(){
        null=NODE(0,NULL,NULL,0);
        null->l=null;null->r=null;
        return null;
}
link insert_node(link t ,int item, int sw){
        if(t==null) return NODE(item,null,null,1);
        if(t->l->red && t->r->red){
                t->red=1;t->l->red=0;t->r->red=0;
        }
        if(item<t->item){
                t->l=insert_node(t->l,item,0);
                if(t->red && t->l->red && sw) t=rotR(t);
                if(t->l->red && t->l->l->red)
                { t=rotR(t); t->red=0; t->r->red=1; }
        }else{
                t->r=insert_node(t->r,item,1);
                if(t->red && t->r->red && !sw) t=rotL(t);
                if(t->r->red && t->r->r->red)
                { t=rotL(t); t->red=0; t->l->red=1; }
        }
        return t;
}
link RBinsert(link root,int item){
        root=insert_node(root,item,0);
        root->red=0;
        return root;
}
int main(){
        int i=0;
        srand(time(NULL));
        link root=RBinit();
        for(i=0;i<N;i++)
                root=RBinsert(root,rand()%100);
        printf("\t\\tree");
        pprint(root);
        printf("\n");
        return 0;
}


视频中的ptree应该是自己写的一个层序遍历的例子
层序遍历大概这样,还需要完善下:
[root@VM_253_237_tlinux ~/tree]# cat ltree.c 
#include <stdlib.h>
#include <stdio.h>
#define max(a,b) (a>b?a:b)
typedef struct Node *link;
struct Node{
        int item;link l,r;
};
link NODE(int item,link l,link r){
        link t=malloc(sizeof *t);
        t->item=item;t->l=l;t->r=r;
        return t;
}
link Construct() {
        link node4 = NODE(7, NULL, NODE(3,NULL,NULL));
        link node3 = NODE(4,NULL,NULL);
        link node2 = NODE(12,NULL,NULL);
        link node1 = NODE(5, node3, node4);
        link root  = NODE(10, node1, node2);
        return root;
}
int PrintByLevel(link root, int level) {
        if(root == NULL)
                return 0;
        if(level == 1) {
                printf("%d ",root->item);
                return 1;
        }
        return PrintByLevel(root->l, level - 1) + PrintByLevel(root->r, level - 1);
}
int GetTreeHeight(link root) {
        if(root == NULL)
                return 0;
        return max(GetTreeHeight(root->l) + 1, GetTreeHeight(root->r) + 1);
}
int main() {
        link root = Construct();
        int height = GetTreeHeight(root);
        int i=0;
        for( i = 1; i <= height; i++) {
                PrintByLevel(root, i);
                printf("\n");
        }
        return 0;
}

http://www.cppblog.com/ngaut/archive/2012/09/06/2351.html


打印树



#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <curses.h>
#include <time.h>
#define N 10
typedef struct node *link;
struct node{
        int item;link l,r;
};
static void recur_print( struct node * node, int line, int col ){
        if( node == NULL ){
                move( line, col ) ;
                addstr("*");//此处为加*号的代码,用来占位,可去掉。
                return ;
        }
        int t = COLS/pow( 2, line+2 );
        char buf[9];
        sprintf(buf,"%-d", node->item ) ;
        move( line , col ) ;
        addstr( buf ) ;
        if( node->l != NULL || node->r != NULL ){
                move(line+1, col-t-1 ) ;
                addstr("[");
                move(line+1, col+t+3) ;
                addstr("]");
        }
        recur_print( node->l, line+1, col-t ) ;
        recur_print( node->r, line+1, col+t ) ;
}
void print_tree(struct node * root){
        initscr() ;
        clear();
        recur_print(root, 0, COLS/2);
        move(LINES-1, COLS-1) ;
        refresh() ;
        getchar() ;
        endwin() ;
}
link NODE(int item,link l,link r){
        link t=malloc(sizeof *t);
        t->item=item;t->l=l;t->r=r;
        return t;
}
link insert_node(link t,int item){
        if(t==NULL) return  NODE(item,NULL,NULL);
        if(item<t->item)
                t->l=insert_node(t->l,item);
        else
                t->r=insert_node(t->r,item);
        return t;
}
void pprint(link t){
        printf("(");
        if(t!=NULL){
                printf("%d",t->item);
                pprint(t->l);
                pprint(t->r);
        }
        printf(")");
}
int bst_search(link t,int item){
        if(t==NULL) return 0;
        if(item<t->item)return bst_search(t->l,item);
        else if(item>t->item) return bst_search(t->r,item);
        else return 1;
}
int main(){
        printf("aaa");
srand(time(NULL));
        int i ;link root=NULL;
        for(i=0;i<N;i++) root =insert_node(root,rand()%100);
        printf("\n");
        printf("\t\\tree");pprint(root);
        print_tree(root);
        return 0;
}

编译的时候需要 gcc  -lm -lcurses ctree.c
需要安装ncurses

参考了
http://biancheng.dnbcw.info/linux/248916.html
分享到:
评论

相关推荐

    排序二叉树, 数据结构中的hello world

    为了解决排序二叉树可能倾斜的问题,引入了平衡二叉树的概念,如AVL树和红黑树。这些平衡二叉树通过旋转等操作保持树的平衡,确保最坏情况下的操作效率也能保持在O(log n)。 **五、总结** 排序二叉树是数据结构中...

    校招面试题目

    - **平衡保障方法**:常见的平衡二叉树类型包括AVL树和红黑树。AVL树通过旋转操作来维持树的平衡,而红黑树则通过对节点着色并遵循特定规则来维护平衡。这些技术的核心在于,在进行插入或删除操作后,通过一系列的...

    搜狐2012.9.15校园招聘会笔试题.docx

    7. 红黑树、AVL树是特定类型的二叉搜索树,满足二叉树定义。B树是多路搜索树,不是严格意义上的二叉树。B+树是B树的一种变体,也有多个分支。答案是AC。 8. 在二维数组`A[2][3]`中,`A[1][0]`表示第二行第一列的...

    一些公司笔试的数据结构和C++字符串操作

    2. 高级数据结构:如树(二叉树、平衡树如AVL和红黑树)、图、堆(最大堆和最小堆)、哈希表等。 3. 操作:插入、删除、查找、排序等,以及它们的时间复杂度分析。 4. 图算法:如深度优先搜索(DFS)和广度优先搜索...

    《数据结构与算法分析》

    树结构如二叉树、红黑树、AVL树等在搜索、排序等方面有广泛应用;图则用于模拟现实世界中的复杂关系,如网络拓扑、社交网络等。哈希表则提供了快速查找的能力,其查找时间复杂度可达到O(1)。 其次,算法是解决问题...

    Packt.Learn.Data.Structures.and.Algorithms.with.Golang.1789618509.rar

    这本书会介绍各种经典的数据结构,如数组、链表、栈、队列、树(二叉树、平衡树如AVL树和红黑树)、图以及哈希表等。理解这些数据结构的特性和操作方式对于编写高效代码至关重要。 算法是解决问题的步骤或方法,是...

    code.zip

    这里可能涉及二叉树、平衡树(如AVL树或红黑树)、堆(如二叉堆)等。Python中可以使用类来实现这些数据结构,同时可能包含插入、删除、查找等操作。 4. **branch.py**:分支可能与树的分支有关,也可能是版本控制...

    浙江大学2015-2016高级数据结构与算法分析试卷及答案

    这是因为红黑树在经过插入和删除操作之后需要通过旋转和重新着色来保持树的平衡。 在使用3盘进行2路合并排序时,不同的原始分布可能影响到合并的效率。具体到(34,21)和(27,28)这两个分布,前者在某些情况下可能会有...

    structuri_de_date

    11. 树形结构(Tree Structure):Python可以用来构建二叉树、红黑树等树结构,常用于搜索和排序算法。虽然没有内置的树数据结构,但可以通过自定义类来实现。 12. 哈希表(Hash Table):Python的字典底层实现就是...

    Java数据结构概述图表

    - 常见的树形结构包括二叉树、红黑树等。Java中没有直接提供树结构的支持,但可以通过自定义类实现。 - 示例:`TreeNode root = new TreeNode(1);` 7. **图(Graph)** - 图是由顶点集和边集构成的非线性数据...

    数据结构与算法分析(C++版)(第二版)习题参考答案

    - **平衡二叉搜索树(Balanced Binary Search Trees)**:例如AVL树和红黑树,它们能够保持较好的平衡性,从而提高查找效率。 **知识点7:排序算法** - **内部排序**:所有待排序的元素都保存在内存中进行排序的方法...

    Data-Structures-in-Python:这些是用python编写的用于自学习的数据结构列表

    12. 树(Tree):虽然Python没有内置的树数据结构,但可以通过类来构建二叉树、红黑树等。树常用于搜索、排序和组织复杂数据。 13. 图(Graph):图数据结构可以用来表示网络、关系等复杂结构,Python的`networkx`库...

Global site tag (gtag.js) - Google Analytics