花忆雨吧 关注:10贴子:537
  • 8回复贴,共1

花忆﹋﹎雨° 生成树

只看楼主收藏回复

#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int status;
typedef struct BiTNode
{
char Data;
struct BiTNode* lChild,* rChild;
}
BiTNode,*BiTree;
status CreateTree(BiTree &T)
{/*先序序列:abd##e##cf##g##*/
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
{
exit(OVERFLOW);
}
T->Data=ch;//生成根节点
CreateTree(T->lChild); //构造左子树链表
CreateTree(T->rChild); //构造右子树链表
}
return OK;
}
void PreOrderTraval(BiTree T,status(*Visit)(char e))
{
if(T)
{
Visit(T->Data);
PreOrderTraval(T->lChild,Visit);
PreOrderTraval(T->rChild,Visit);
}
}
void InOrderTraval(BiTree T,status(*Visit)(char e))
{
if(T)
{
InOrderTraval(T->lChild,Visit);
Visit(T->Data);
InOrderTraval(T->rChild,Visit);
}
}
void PostOrderTraval(BiTree T,status(*Visit)(char e))
{
if(T)
{
PostOrderTraval(T->lChild,Visit);
PostOrderTraval(T->rChild,Visit);
Visit(T->Data);
}
}
status Visit(char Data)
{
printf("%c",Data);
return OK;
}
status Display(BiTree T,int Level)
{
int i;
if(T==NULL) return 0;
Display(T->lChild,Level+1);
for(i=0;i<Level-1;i++)
printf(" ");
if(Level>=1) printf("---");
printf("%c\n",T->Data);
Display(T->rChild,Level+1);
return OK;
}
void ShowLeaves(BiTree T)
{
if(T)
{
if(T->lChild==NULL&&T->rChild==NULL)
Visit(T->Data);
ShowLeaves(T->lChild);
ShowLeaves(T->rChild);
}
}


1楼2014-04-01 11:28回复
    防吞
    #include<conio.h>
    #include<stdio.h>
    #include<stdlib.h>
    #define OK 1
    #define ERROR 0
    #define OVERFLOW -2
    typedef int status;
    typedef struct BiTNode
    {
    char Data;
    struct BiTNode* lChild,* rChild;
    }
    BiTNode,*BiTree;
    status CreateTree(BiTree &T)
    {/*先序序列:abd##e##cf##g##*/
    char ch;
    scanf("%c",&ch);
    if(ch=='#') T=NULL;
    else
    {
    if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))
    {
    exit(OVERFLOW);
    }
    T->Data=ch;//生成根节点
    CreateTree(T->lChild); //构造左子树链表
    CreateTree(T->rChild); //构造右子树链表
    }
    return OK;
    }
    void PreOrderTraval(BiTree T,status(*Visit)(char e))
    {
    if(T)
    {
    Visit(T->Data);
    PreOrderTraval(T->lChild,Visit);
    PreOrderTraval(T->rChild,Visit);
    }
    }
    void InOrderTraval(BiTree T,status(*Visit)(char e))
    {
    if(T)
    {
    InOrderTraval(T->lChild,Visit);
    Visit(T->Data);
    InOrderTraval(T->rChild,Visit);
    }
    }
    void PostOrderTraval(BiTree T,status(*Visit)(char e))
    {
    if(T)
    {
    PostOrderTraval(T->lChild,Visit);
    PostOrderTraval(T->rChild,Visit);
    Visit(T->Data);
    }
    }
    status Visit(char Data)
    {
    printf("%c",Data);
    return OK;
    }
    status Display(BiTree T,int Level)
    {
    int i;
    if(T==NULL) return 0;
    Display(T->lChild,Level+1);
    for(i=0;i<Level-1;i++)
    printf(" ");
    if(Level>=1) printf("---");
    printf("%c\n",T->Data);
    Display(T->rChild,Level+1);
    return OK;
    }
    void ShowLeaves(BiTree T)
    {
    if(T)
    {
    if(T->lChild==NULL&&T->rChild==NULL)
    Visit(T->Data);
    ShowLeaves(T->lChild);
    ShowLeaves(T->rChild);
    }
    }


    2楼2014-04-01 11:29
    回复
      主函数
      int main()
      {
      BiTree T;
      printf("\n创建并输出树\n:");
      CreateTree(T);
      Display(T,0);
      printf("\n");
      printf("\nPreOrder:");
      PreOrderTraval(T,Visit);
      printf("\n");
      printf("\nInOrder:");
      InOrderTraval(T,Visit);
      printf("\n");
      printf("\nPostOrder:");
      PostOrderTraval(T,Visit);
      printf("\n");
      printf("\nShowLeaves:");
      ShowLeaves(T);
      printf("\n-----------------------\n");
      printf("\n");
      }


      3楼2014-04-04 20:41
      回复
        #include<stdio.h>
        #include<malloc.h>
        #define MaxSize 100
        typedef char ElemType;
        typedef struct node{
        ElemType data; //数据元素
        struct node *lchild; //指向左孩子
        struct node *rchild; //指向右孩子
        }BTNode;
        void CreateBTNode(BTNode *&b,char *str){ //由str串创建二叉链
        BTNode *St[MaxSize],*p=NULL;
        int top=-1,k,j=0;
        char ch;
        b=NULL; //建立的二叉树初始时为空
        ch=str[j];
        while(ch!='\0'){ //str未扫描完时循环
        switch(ch){
        case '(':top++;St[top]=p;k=1;break; //为左结点
        case ')':top--;break;
        case ',':k=2;break; //为右结点
        default :p=(BTNode *)malloc(sizeof(BTNode));
        p->data=ch;
        p->lchild=p->rchild=NULL;
        if(b==NULL)
        b=p; //p指向二叉树的根结点
        else{
        switch(k){
        case 1:St[top]->lchild=p;break;
        case 2:St[top]->rchild=p;break;
        }
        }
        }
        j++;
        ch=str[j];
        }
        }


        4楼2014-04-08 11:43
        回复
          void DispBTNode(BTNode *b){ //以括号表示法输出二叉树
          if(b!=NULL){
          printf("%c",b->data);
          if(b->lchild!=NULL || b->rchild!=NULL){
          printf("(");
          DispBTNode(b->lchild);
          if(b->rchild!=NULL)
          printf(",");
          DispBTNode(b->rchild);
          printf(")");
          }
          }
          }
          void AllPath(BTNode *b){ //采用非递归方法输出从叶子结点到根结点的路径
          struct snode{
          BTNode *node; //存放当前结点指针
          int parent; //存放双亲结点在队列中的位置
          }Qu[MaxSize]; //定义顺序队列
          int front,rear,p; //定义队头和队尾指针
          front=rear=-1; //置队列为空队列
          rear++;
          Qu[rear].node=b; //根结点指针进入队列
          Qu[rear].parent=-1; //根结点没有双亲结点
          while(front<rear){ //队列不为空
          front++;
          b=Qu[front].node; //队头出队列
          if(b->lchild==NULL && b->rchild==NULL){ //*b为叶子结点
          printf("%c到根结点路径:",b->data);
          p=front;
          while(Qu[p].parent!=-1){
          printf("%c ",Qu[p].node->data);
          p=Qu[p].parent;
          }
          printf("%c\n",Qu[p].node->data);
          }
          if(b->lchild!=NULL){ //左孩子入队列
          rear++;
          Qu[rear].node=b->lchild;
          Qu[rear].parent=front;
          }
          if(b->rchild!=NULL){ //右孩子入队列
          rear++;
          Qu[rear].node=b->rchild;
          Qu[rear].parent=front;
          }
          }
          }


          5楼2014-04-08 11:43
          回复
            完全不明白……o(>﹏<)o


            IP属地:浙江来自Android客户端6楼2014-09-25 16:49
            收起回复
              7楼2014-12-08 08:33
              回复