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

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

 
阅读更多
红黑树的打印
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 100
#define Pstart 62
#define N 10
//typedef struct node *link;
typedef struct node 
{
    int    key;
    int    item;
    struct node *l,
                *r;
}BTNode;
typedef struct pnode        
{
    int key;                   
    int item;                  
   // struct pnode *left,      
//               *right,     // this no need to use left ,right 
//               *parent;      
    struct pnode *parent;     
    int lrflag,                //left 0,right 1
        space,                 //print point
        level;                 //the node level
}PBTNode;
BTNode* null;//null node
BTNode* CreateBTNode(char *s)
{
    char ch;
    BTNode *p=null,
           *b=null,
           *ps[MaxSize];
    int top=-1,
        tag=-1;
    ch=*s;
    while(ch)
    {
        switch(ch)
        {
            case '(':ps[++top]=p;tag=1;break;
            case ',':tag=2;break;
            case ')':top--;break;
            default:
                     p=(BTNode*)malloc(sizeof(BTNode));
                     p->item=ch;
                     p->l=p->r=null;
                     if(b==null)
                         b=p;
                     else
                     {
                         switch(tag)
                         {
                             case 1:ps[top]->l=p;break;
                             case 2:ps[top]->r=p;break;
                         }
                     }
        }
        ch=*(++s);
    }
    return b;
}

//print ()()
void DispBTNode(BTNode *b)
{
    if(b!=null)
    {
        printf("%d",b->item);
        if(b->l!=null||b->r!=null)
        {
            printf("(");
            DispBTNode(b->l);
            if(b->r!=null)printf(",");
            DispBTNode(b->r);
            printf(")");
        }
    }
}
int BTNodeHeight(BTNode *b)
{
    int lh,rh;
    if(b==null)return 0;
    else
    {
        lh=BTNodeHeight(b->l);
        rh=BTNodeHeight(b->r);
        return (lh>rh)?(lh+1):(rh+1);
    }
}

void SetPBTNodeInfo(BTNode *b,PBTNode *parent,PBTNode *pb,int level,int lrflag)
{
    int f=3;
    pb->item=b->item;
    pb->key =b->key;
    pb->parent=parent;
    pb->level=level;
    pb->lrflag=lrflag;
    pb->space=-3;
}

/*Level Order BTNode----->PBTNode*/
int CreatePBTNode(BTNode *b,PBTNode *pqu[])
{
    BTNode *p;
    BTNode *qu[MaxSize];
    int front=-1,
        rear=-1;
    rear++;
    qu[rear]=b;
    pqu[rear]=(PBTNode*)malloc(sizeof(PBTNode));
    SetPBTNodeInfo(b,NULL,pqu[rear],1,-1);
    while(rear!=front)
    {
        front++;
        p=qu[front];
        if(p->l!=null)
        {
            rear++;
            qu[rear]=p->l;
                printf("btnode:begin %d\n",rear);
            pqu[rear]=(PBTNode*)malloc(sizeof(PBTNode));
                printf("btnode:end\n");
            SetPBTNodeInfo(p->l,pqu[front],pqu[rear],pqu[front]->level+1,0);
        }
        if(p->r!=null)
        {
            rear++;
            qu[rear]=p->r;
            pqu[rear]=(PBTNode*)malloc(sizeof(PBTNode));
            SetPBTNodeInfo(p->r,pqu[front],pqu[rear],pqu[front]->level+1,1);
        }
    }
    return rear;
}
//打印一层结点,及该层结点与父结点的连线路径。
void PBTNodePrint(PBTNode *pb[],int n,int h)
{
    int l=-1,
        r=0,
        i,j,k,
        end;
    char c;
    PBTNode *p;
    if(n<=0||h<=0)
    {
        return;
    }
    else if(n==1)
    {
        for(i=0;i<pb[0]->space;i++)
            printf(" ");
                printf("%d%c",pb[0]->item,pb[0]->key?'+':' ');
        printf("\n");
        return;
    }
    h=h-pb[0]->level+2;
    for(k=0;k<h;k++)
    {
        j=0;
        l--;
        r++;

        for(i=0;i<n;i++)//print line
        {
            p=pb[i];
            end=(p->lrflag==0)?l:r;
            end+=p->parent->space;
            for(;j<end;j++)
                printf(" ");
            c=(p->lrflag==0)?'/':'\\';
            printf("%c",c);
        }
        printf("\n");
    }
    for(i=0;i<n;i++)//this level ,the node should point
    {
        p=pb[i];
        if(p->lrflag==0)
            p->space=p->parent->space+l;
        else
            p->space=p->parent->space+r;
    }
    for(i=0,j=0;i<n;i++)//data
    {
        p=pb[i];
        for(;j<p->space;j++)
            printf(" ");
                printf("%d%c",p->item,p->key?'+':' ');
    }
    printf("\n");
}
void DispBTree(BTNode *b)
{
    int n,i,j,high,
        level;
    PBTNode *p;
    PBTNode *pqu[MaxSize];
    PBTNode *levelpqu[MaxSize];
        printf("DispBtree\n");
    n=CreatePBTNode(b,pqu);
    high=BTNodeHeight(b);
    j=0;
    level=1;
    pqu[0]->space=Pstart;
    for(i=0;i<=n;i++)
    {
        p=pqu[i];
        if(p->level==level)
        {
            levelpqu[j]=p;
            j++;
        }
        else
        {
            PBTNodePrint(levelpqu,j,high);
            level=p->level;
            j=0;
            levelpqu[j]=p;
            j++;
        }
    }
    PBTNodePrint(levelpqu,j,high);

}

//----------------------rbtree2.c
BTNode* NODE(int item,BTNode* l,BTNode* r,int key){
        BTNode* t=malloc(sizeof *t);
        t->item=item;t->l=l;t->r=r;t->key=key;
        return t;
}
BTNode* rotR(BTNode* t){
        BTNode* x=t->l;t->l=x->r;x->r=t;return x;
}
BTNode* rotL(BTNode* t){
        BTNode* x=t->r;t->r=x->l;x->l=t;return x;
}
void pprint(BTNode* t){
        printf("(");
        if(t!=null){ 
                printf("%d%c",t->item,t->key?'+':' ');
                pprint(t->l);
                pprint(t->r);
        }
        printf(")");
}
BTNode* RBinit(){
        null=NODE(0,null,null,0);
        null->l=null;null->r=null;
        return null;
}
BTNode* insert_node(BTNode* t ,int item, int sw){
        if(t==null) return NODE(item,null,null,1);
        if(t->l->key && t->r->key){
                t->key=1;t->l->key=0;t->r->key=0;
        }
        if(item<t->item){
                t->l=insert_node(t->l,item,0);
                if(t->key && t->l->key && sw) t=rotR(t);
                if(t->l->key && t->l->l->key)
                { t=rotR(t); t->key=0; t->r->key=1; }
        }else{
                t->r=insert_node(t->r,item,1);
                if(t->key && t->r->key && !sw) t=rotL(t);
                if(t->r->key && t->r->r->key)
                { t=rotL(t); t->key=0; t->l->key=1; }
        }
        return t;
}
BTNode* RBinsert(BTNode* root,int item){
        root=insert_node(root,item,0);
        root->key=0;
        return root;
}
int main(){
        int i=0;
        srand(time(NULL));
        BTNode* root=RBinit();
        for(i=0;i<N;i++)
                root=RBinsert(root,rand()%100);
        printf("pprint:\n");
        printf("\t\\tree");
        pprint(root);
        printf("\n");

        printf("DispBtnode:\n");
        DispBTNode(root);printf("\n");
        printf("DispBTree:\n");
        DispBTree(root);
        return 0;
}
root@raspberrypi:~/hellogit/hello/tree/tree# 



  • 大小: 44.7 KB
分享到:
评论

相关推荐

    排序二叉树, 数据结构中的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)这两个分布,前者在某些情况下可能会有...

    Java数据结构概述图表

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

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

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

    structuri_de_date

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

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

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

Global site tag (gtag.js) - Google Analytics