| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1737 人关注过本帖
标题:搜集最优秀的 树 和 二叉树 的相关代码。/
只看楼主 加入收藏
xiaomarn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:348
专家分:2026
注 册:2009-3-18
收藏
得分:7 
路过顺便接分,算法导论(可惜还没看多少)
2010-12-23 19:20
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:0 
程序3:
程序代码:
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<math.h> /* floor(),ceil(),abs() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
#define N 16 /* 数据元素个数 */
typedef struct
{
  int ord;
}Others; /* 记录的其它部分 */
#define Nil ' ' /* 定义结束符为空格(与教科书不同) */
#define MAXKEYLEN 16 /* 关键字的最大长度 */
typedef struct
{
  char ch[MAXKEYLEN]; /* 关键字 */
  int num; /* 关键字长度 */
}KeysType; /* 关键字类型 */
typedef struct
{
  KeysType key; /* 关键字 */
  Others others; /* 其它部分(由主程定义) */
}Record; /* 记录类型 */
typedef enum{LEAF,BRANCH}NodeKind; /* 结点种类:{叶子,分支} */
typedef struct DLTNode /* 双链树类型 */
{
  char symbol;
  struct DLTNode *next; /* 指向兄弟结点的指针 */
  NodeKind kind;
  union
  {
    Record *infoptr; /* 叶子结点的记录指针 */
    struct DLTNode *first; /* 分支结点的孩子链指针 */
  }a;
}DLTNode,*DLTree;
Status InitDSTable(DLTree *DT)
{ /* 操作结果: 构造一个空的双链键树DT */
  *DT=NULL;
  return OK;
}
void DestroyDSTable(DLTree *DT)
{ /* 初始条件: 双链键树DT存在。操作结果: 销毁双链键树DT */
  if(*DT) /* 非空树 */
  {
    if((*DT)->kind==BRANCH&&(*DT)->a.first) /* *DT是分支结点且有孩子 */
      DestroyDSTable(&(*DT)->a.first); /* 销毁孩子子树 */
    if((*DT)->next) /* 有兄弟 */
      DestroyDSTable(&(*DT)->next); /* 销毁兄弟子树 */
    free(*DT); /* 释放根结点 */
    *DT=NULL; /* 空指针赋0 */
  }
}
Record *SearchDLTree(DLTree T,KeysType K)
{ /* 在非空双链键树T中查找关键字等于K的记录,若存在, */
  /* 则返回指向该记录的指针,否则返回空指针。*/
  DLTree p;
  int i;
  if(T)
  {
    p=T; /* 初始化 */
    i=0;
    while(p&&i<K.num)
    {
      while(p&&p->symbol!=K.ch[i]) /* 查找关键字的第i位 */
        p=p->next;
      if(p&&i<K.num) /* 准备查找下一位 */
        p=p->a.first;
      ++i;
    } /* 查找结束 */
    if(!p) /* 查找不成功 */
      return NULL;
    else /* 查找成功 */
      return p->a.infoptr;
  }
  else
    return NULL; /* 树空 */
}
void InsertDSTable(DLTree *DT,Record *r)
{ /* 初始条件: 双链键树DT存在,r为待插入的数据元素的指针 */
  /* 操作结果: 若DT中不存在其关键字等于(*r).key.ch的数据元素, */
  /*           则按关键字顺序插r到DT中 */
  DLTree p=NULL,q,ap;
  int i=0;
  KeysType K=r->key;
  if(!*DT&&K.num) /* 空树且关键字符串非空 */
  {
    *DT=ap=(DLTree)malloc(sizeof(DLTNode));
    for(;i<K.num;i++) /* 插入分支结点 */
    {
      if(p)
        p->a.first=ap;
      ap->next=NULL;
      ap->symbol=K.ch[i];
      ap->kind=BRANCH;
      p=ap;
      ap=(DLTree)malloc(sizeof(DLTNode));
    }
    p->a.first=ap; /* 插入叶子结点 */
    ap->next=NULL;
    ap->symbol=Nil;
    ap->kind=LEAF;
    ap->a.infoptr=r;
  }
  else /* 非空树 */
  {
    p=*DT; /* 指向根结点 */
    while(p&&i<K.num)
    {
      while(p&&p->symbol<K.ch[i]) /* 沿兄弟结点查找 */
      {
        q=p;
        p=p->next;
      }
      if(p&&p->symbol==K.ch[i]) /* 找到与K.ch[i]相符的结点 */
      {
        q=p;
        p=p->a.first; /* p指向将与K.ch[i+1]比较的结点 */
        ++i;
      }
      else /* 没找到,插入关键字 */
      {
        ap=(DLTree)malloc(sizeof(DLTNode));
        if(q->a.first==p)
          q->a.first=ap; /* 在长子的位置插入 */
        else /* q->next==p */
          q->next=ap; /* 在兄弟的位置插入 */
        ap->next=p;
        ap->symbol=K.ch[i];
        ap->kind=BRANCH;
        p=ap;
        ap=(DLTree)malloc(sizeof(DLTNode));
        i++;
        for(;i<K.num;i++) /* 插入分支结点 */
        {
          p->a.first=ap;
          ap->next=NULL;
          ap->symbol=K.ch[i];
          ap->kind=BRANCH;
   p=ap;
          ap=(DLTree)malloc(sizeof(DLTNode));
        }
        p->a.first=ap; /* 插入叶子结点 */
        ap->next=NULL;
        ap->symbol=Nil;
        ap->kind=LEAF;
        ap->a.infoptr=r;
      }
    }
  }
}
typedef struct
{
  char ch;
  DLTree p;
}SElemType; /* 定义栈元素类型 */
#define STACK_INIT_SIZE 10 /* 存储空间初始分配量 */
#define STACKINCREMENT 2 /* 存储空间分配增量 */
typedef struct SqStack
{
  SElemType *base; /* 在栈构造之前和销毁之后,base的值为NULL */
  SElemType *top; /* 栈顶指针 */
  int stacksize; /* 当前已分配的存储空间,以元素为单位 */
}SqStack; /* 顺序栈 */
Status InitStack(SqStack *S)
{ /* 构造一个空栈S */
  (*S).base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
  if(!(*S).base)
    exit(OVERFLOW); /* 存储分配失败 */
  (*S).top=(*S).base;
  (*S).stacksize=STACK_INIT_SIZE;
  return OK;
}
Status StackEmpty(SqStack S)
{ /* 若栈S为空栈,则返回TRUE,否则返回FALSE */
  if(S.top==S.base)
    return TRUE;
  else
    return FALSE;
}
Status Push(SqStack *S,SElemType e)
{ /* 插入元素e为新的栈顶元素 */
  if((*S).top-(*S).base>=(*S).stacksize) /* 栈满,追加存储空间 */
  {
    (*S).base=(SElemType *)realloc((*S).base,((*S).stacksize+STACKINCREMENT)*sizeof(SElemType));
    if(!(*S).base)
      exit(OVERFLOW); /* 存储分配失败 */
    (*S).top=(*S).base+(*S).stacksize;
    (*S).stacksize+=STACKINCREMENT;
  }
  *((*S).top)++=e;
  return OK;
}
Status Pop(SqStack *S,SElemType *e)
{ /* 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR */
  if((*S).top==(*S).base)
    return ERROR;
  *e=*--(*S).top;
  return OK;
}
void TraverseDSTable(DLTree DT,void(*Vi)(Record))
{ /* 初始条件: 双链键树DT存在,Vi是对结点操作的应用函数, */
  /*           ViR是对记录操作的应用函数 */
  /* 操作结果: 按关键字的顺序输出关键字及其对应的记录 */
  SqStack s;
  SElemType e;
  DLTree p;
  int i=0,n=8;
  if(DT)
  {
    InitStack(&s);
    e.p=DT;
    e.ch=DT->symbol;
    Push(&s,e);
    p=DT->a.first;
    while(p->kind==BRANCH) /* 分支结点 */
    {
      e.p=p;
      e.ch=p->symbol;
      Push(&s,e);
      p=p->a.first;
    }
    e.p=p;
    e.ch=p->symbol;
    Push(&s,e);
    Vi(*(p->a.infoptr));
    i++;
    while(!StackEmpty(s))
    {
      Pop(&s,&e);
      p=e.p;
      if(p->next) /* 有兄弟结点 */
      {
        p=p->next;
        while(p->kind==BRANCH) /* 分支结点 */
        {
          e.p=p;
          e.ch=p->symbol;
          Push(&s,e);
          p=p->a.first;
        }
        e.p=p;
        e.ch=p->symbol;
        Push(&s,e);
        Vi(*(p->a.infoptr));
        i++;
        if(i%n==0)
          printf("\n"); /* 输出n个元素后换行 */
      }
    }
  }
}
void print(Record e)
{
  int i;
  printf("(");
  for(i=0;i<e.key.num;i++)
    printf("%c",e.key.ch[i]);
  printf(",%d)",e.others.ord);
}
void main()
{
  DLTree t;
  int i;
  char s[MAXKEYLEN+1];
  KeysType k;
  Record *p;
  Record r[N]={{{"CAI"},1},{{"CAO"},2},{{"LI"},3},{{"LAN"},4},
               {{"CHA"},5},{{"CHANG"},6},{{"WEN"},7},{{"CHAO"},8},
               {{"YUN"},9},{{"YANG"},10},{{"LONG"},11},{{"WANG"},12},
               {{"ZHAO"},13},{{"LIU"},14},{{"WU"},15},{{"CHEN"},16}};
  /* 数据元素(以教科书式9-24为例) */
  InitDSTable(&t);
  for(i=0;i<N;i++)
  {
    r[i].key.num=strlen(r[i].key.ch);
    p=SearchDLTree(t,r[i].key);
    if(!p) /* t中不存在关键字为r[i].key的项 */
      InsertDSTable(&t,&r[i]);
  }
  printf("按关键字符串的顺序遍历双链键树:\n");
  TraverseDSTable(t,print);
  printf("\n请输入待查找记录的关键字符串: ");
  scanf("%s",s);
  k.num=strlen(s);
  strcpy(k.ch,s);
  p=SearchDLTree(t,k);
  if(p)
    print(*p);
  else
    printf("没找到");
  printf("\n");
  DestroyDSTable(&t);
}


Go Go Go
2010-12-23 19:21
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:0 
程序4:
程序代码:
#include<stdio.h>
#include<stdlib.h>
/*定义树的结点结构*/

typedef struct TreeNode{
  char data;/*树中结点的数据是一个字符*/
  struct TreeNode *lchild;
  struct TreeNode *rchild;
}TREENODE;
int NodeNum = 0;/*统计数的结点数*/
int LeafNum = 0;/*统计数的叶子结点数*/
char ch[] = {'a', 'b', 'c', ' ', ' ', 'd', ' ', ' ', 'e',  'f', ' ', ' ', 'g', ' ', ' '};
int inc = 0;
/*建立一颗二叉树*/
int CreateBiTree(TREENODE **T)
/*按先序次序输入二叉树中结点的值,以空字符表示空树*/
{
    char i;
    if(ch[inc++]==' ')
        *T = NULL;
    else
    {
        printf("%c\n",ch[inc-1]);
        if(!(*T = (TREENODE *)malloc(sizeof(TREENODE))))
            return -1;
        (*T)->data = ch[inc-1];
        printf("%c\n",(*T)->data);
        CreateBiTree(&((*T)->lchild));
        CreateBiTree(&((*T)->rchild));
    }
    return 1;
}
/*先序遍历二叉树*/
int PreOderTraverse(TREENODE *T)
{
    if(T)
    {
        printf("%c  ",T->data);
        PreOderTraverse(T->lchild);
        PreOderTraverse(T->rchild);
    }
    return 1;
}
/*  中序遍历二叉树*/
int InOderTraverse(TREENODE *T)
{
    if(T)
    {
        InOderTraverse(T->lchild);
        printf("%c  ",T->data);
        InOderTraverse(T->rchild);
    }
    return 1;
}
/*  后序遍历二叉树*/
int BackOderTraverse(TREENODE *T)
{
    if(T)
    {
        BackOderTraverse(T->lchild);
        BackOderTraverse(T->rchild);
        printf("%c  ",T->data);
    }
    return 1;
}
/*利用先序遍历来计算树中的结点数*/
void CountNodeNum(TREENODE *T)
{
    if(T)
    {
        NodeNum ++;
        CountNodeNum(T->lchild);
        CountNodeNum(T->rchild);
    }
}
/*利用先序遍历计算叶子节点数*/
void CountLeafNum(TREENODE *T)
{
    if(T)
    {
        if((!(T->lchild))&&(!(T->rchild)))
            LeafNum ++;
        CountLeafNum(T->lchild);
        CountLeafNum(T->rchild);
    }
}
int main()
{
    TREENODE *T;
    int i;
    CreateBiTree(&T);
    do
    {
        clrscr();
        puts("**************************************************");
        puts("*                   you can choose:              *");
        puts("*  1:  Traverse the Binary tree by pre order     *");
      puts("*  2:  Traverse the Binary tree by mid order     *");
      puts("*  3:  Traverse the Binary tree by back order    *");
      puts("*  4:  Count the node num of the Binary tree     *");   
      puts("*  5:  Count the leaf node num of the Binary tree*");
        puts("**************************************************");
        puts("please input your choice:");
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                    printf("The preoder is:\n");
                    PreOderTraverse(T);
                    printf("\n");
                    break;
                case 2:
                    printf("The midoder is:\n");
                    InOderTraverse(T);
                    printf("\n");
                    break;
                case 3:
                    printf("The backoder is:\n");
                    BackOderTraverse(T);
                    printf("\n");
                    break;   
                case 4:
                    CountNodeNum(T);
                    printf("The nodenum of the tree is:%d\n",NodeNum);
                    break;   
                case 5:
                    CountLeafNum(T);
                    printf("The leafnum of the tree is:%d\n",LeafNum);
                    break;
        }
        printf("please input any char to go on\n");
        getch();
    }while((i>=1)&&(i<6));
   
    getch();
    return 1;
}



Go Go Go
2010-12-23 19:23
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:0 
程序5:
程序代码:
#include<stdlib.h>
#include<stdio.h>
typedef struct node/*定义线索二叉树结点结构*/
{
char data;
struct node *lchild,*rchild;
int ltag,rtag;
}bithrnode,*bithrtree;
bithrtree CreatTree()/*创建二叉链表*/
{
char a;
bithrtree new;
scanf("%c",&a);
if(a=='#')
return NULL;
else
{
new=(bithrtree)malloc(sizeof(bithrnode));
new->data=a;
new->ltag=0;
new->rtag=0;
new->lchild=CreatTree();/*递归创建左子树*/
new->rchild=CreatTree();/*递归创建右子树*/
}
return new;
}
void inthread(bithrtree p,bithrtree pre)/*将二叉树线索化*/
{
if(p)
{
inthread(p->lchild,pre);/*将左子树线索化*/
if(p->lchild==NULL)
{
p->ltag=1;/*p->ltag置1*/
p->lchild=pre;/*左指针指向其前驱*/
}
if(pre->rchild==NULL)
{
pre->rtag=1;/*pre->rtag置1*/
pre->rchild=p;/*右指针指向其前驱*/
}
pre=p;
inthread(p->rchild,pre);/*将右子树线索化*/
}
}
bithrtree inorder_thread(bithrtree t)/*中序遍历线索二叉树并将其线索化*/
{
bithrtree thrt;/*头结点*/
bithrtree pre,p;/*pre访问过的结点,p当前结点*/
thrt=(bithrtree)malloc(sizeof(bithrnode));/*为头结点分配空间*/
thrt->ltag=0;/*初始化标志域*/
thrt->rtag=1;
thrt->rchild=thrt;/*右指针指向头结点本身*/
if(t==NULL)/*判断二叉树是否为空*/
thrt->lchild=thrt;/*左指针指向头结点*/
else
{
p=thrt->lchild=t;/*头结点左指针指向二叉树*/
thrt->ltag=0;
pre=thrt;
inthread(p,pre);/*进行线索化*/
pre->rchild=thrt;/*最后一个结点*/
pre->rtag=1;
thrt->rchild=pre;/*头结点右指针指向最后一个结点*/
thrt->rtag=1;
}
return thrt;
}
void Inorder_thr(bithrtree t)/*中序遍历线索二叉树*/
{
if(t!=NULL)
{
if(t->ltag==0)
Inorder_thr(t->lchild);/*递归遍历左子树*/
printf("%c",t->data);
if(t->rtag==0)
Inorder_thr(t->rchild);/*递归遍历右子树*/
}
}
void main()
{
bithrtree root;
root=CreatTree();/*构建二叉树*/
printf("inorder traversal:\n");
Inorder_thr(root);/*中序遍历二叉树*/
}


Go Go Go
2010-12-23 19:27
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:0 
看看算法和思想就行了 代码还有好多就不一一帖上去了。

Go Go Go
2010-12-23 19:30
a3896863
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2010-12-23
收藏
得分:7 
2010-12-23 20:57
a3896863
Rank: 1
等 级:新手上路
帖 子:2
专家分:7
注 册:2010-12-23
收藏
得分:0 
我用的书 也是 严蔚敏的, 这几天要写 成绩信息管理系统, 头疼死了,唉~~
2010-12-23 20:58
zdyzhang
Rank: 9Rank: 9Rank: 9
来 自:栖息地
等 级:蜘蛛侠
威 望:4
帖 子:2335
专家分:1227
注 册:2008-9-20
收藏
得分:7 
要说好的话,我觉得你学习透了大众的就不错了。

之后借鉴什么的进一步学习什么的还是找国外的资料。

悲剧源于生活。
2010-12-23 21:00
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
我宁愿不学习 数据结构, 也不委屈求全,/

我就是真命天子,顺我者生,逆我者死!
2010-12-24 09:05
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用xiaomarn在2010-12-23 19:20:38的发言:

路过顺便接分,算法导论(可惜还没看多少)
看过很多, 但是看不懂多少 。/

我就是真命天子,顺我者生,逆我者死!
2010-12-24 12:58
快速回复:搜集最优秀的 树 和 二叉树 的相关代码。/
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050938 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved