回 帖 发 新 帖 刷新版面

主题:二叉树各种操作算法

#include"stdlib.h"    /* 存储分配头文件,或用"malloc.h" */
#include"stdio.h"     /* 标准I/O头文件 */
#include"ctype.h"  
#define N 10000                     /* 定义NULL,本行可省去 */
#define LENG sizeof(struct Bnode)  /* 确定结点所占空间的字节数 */
typedef char ElemType;            /* 抽象元素类型为char类型 */


typedef struct Bnode              /* Bnode为结点(C结构体)类型 */
{ ElemType data;                 /* data为抽象元素类型 */
   struct Bnode *lchild, *rchild; /* 为指针类型  */
   signed size;
}Bnode;
int node[4] ;
int creat_tree(Bnode**root )   /* root是指向指针的指针类型 */
{ /* 本算法递归生成二叉树 */
      ElemType ch;
      scanf("%c",&ch);                                       /* 输入结点,字符型 */
      if (ch==' '){ (*root)->data=NULL;
                            return;}                       /* 生成空二叉树 */
      else                                                              /* 生成非空二叉树 */
       { (*root)=(Bnode*)malloc(LENG);       /* 申请结点空间 */
     (*root)->data=ch;                       /* 生成根结点 */
     creat_tree(&(*root)->lchild); /* 递归生成左子树 */
     creat_tree(&(*root)->rchild);    /* 递归生成右子树 */
        }
} /* creat_tree */

void preorder1(Bnode *root)
{                                                    /* 前序遍历二叉树 */
   if (root)
  {    printf("%c",root->data);
     if(root->lchild)preorder1(root->lchild);
     if(root->rchild)preorder1(root->rchild);
  }
} /* preorder */

void preorder2(Bnode *root)
{                                                    /* 中序遍历二叉树 */
    if (root)
    {
         if(root->lchild)preorder2(root->lchild);
         printf("%c",root->data);
        if(root->rchild)preorder2(root->rchild);
     }
} /* preorder */

void preorder3(Bnode *root)
{                                                    /* 后序遍历二叉树 */
        if (root)
       {
            if(root->lchild)preorder3(root->lchild);
            if(root->rchild)preorder3(root->rchild);
            printf("%c",root->data);
       }
} /* preorder */

void preorder4(Bnode *root)/*中序非递归遍历二叉树*/
{   Bnode  *p,*stack[N];
     int top=0;
      p=root;
do{
    while(p!=NULL)
    {
      top++;
      stack[top]=p;
      p=p->lchild;
    }
    if(top>0)
   {
     p=stack[top];/*p所指的 节点为无左子树或其左子树已经遍历过*/
      top--;
     printf("%c",p->data);
     p=p->rchild;
   }
}while(p!=NULL||top!=0);
} /* preorder */

void preorder5(Bnode *root)/*先序非递归遍历二叉树*/
{   Bnode  *p,*stack[N];
     int top ;
      p=root;
   if(root!=NULL)
        {top=1;
          stack[top]=p;
           while(top>0)
          {
           p=stack[top]  ;/*将右小孩放入栈*/
           top--;
           printf("%c",p->data);
           if(p->rchild!=NULL)
           {top++;
            stack[top]=p->rchild;
           }
            if(p->lchild!=NULL)
           {top++;
            stack[top]=p->lchild;
            }
}
} /* preorder */
void degrees(Bnode *root)/*中序非递归遍历二叉树*/
{   Bnode  *p,*stack[N];
     int top=0,i=0,j=0,k=0;
      p=root;
do{
    while(p!=NULL)
    {
      top++;
      stack[top]=p;
      p=p->lchild;
    }
    if(top>0)
   {
     p=stack[top];/*p所指的 节点为无左子树或其左子树已经遍历过*/
      top--;
      if(p->lchild!=NULL&&p->rchild!=NULL)k++;
     else  if(p->lchild==NULL&&p->rchild==NULL)i++;
      else j++;
     printf("%c",p->data);
     p=p->rchild;
   }
}while(p!=NULL||top!=0);
printf("Dgrees=0:   %d",i);
printf("Dgrees=1:    %d",j);
printf("Dgrees=2:   %d",k);
} /* preorder */

int  nodes(Bnode *root)
{
int num1,num2;
if(root==NULL)return(0);
else
{
  num1=nodes(root->lchild);
  num2=nodes(root->rchild);
  return(num1+num2+1);/*加1是因为要算上根节点*/
}
}
int  nodeO(Bnode *root)
{
int num1,num2;
if(root==NULL)return(0);
else
{
  num1=nodeO(root->lchild);
  num2=nodeO(root->rchild);
  if(root->lchild==NULL&&root->rchild==NULL)
  return(num1+num2+1);/*加1是因为要算上根节点*/
  else  return(num1+num2);
}
}

int  node1(Bnode *root)
{
int num1,num2;
if(root==NULL)return(0);
else if( (root->lchild!=NULL&&root->rchild==NULL) ||(root->lchild==NULL&&root->rchild!=NULL))
  return(1);
else
{
  num1=node1(root->lchild);
  num2=node1(root->rchild);
   return(num1+num2+1 );/*加1是因为要算上根节点*/
    
  }
}
int  node2(Bnode *root)
{
int num1,num2;
if(root==NULL)return(0);
else
{
  num1=node2(root->lchild);
  num2=node2(root->rchild);
  if(root->lchild!=NULL&&root->rchild!=NULL)
  return(num1+num2+1);/*加1是因为要算上根节点*/
  else  return(num1+num2);
}
}
void main(void)      /*主函数*/
    { int j ;
      char CH;  
      Bnode *root;  /* root是指向根结点的指针变量 */
      root=(Bnode *)malloc(sizeof(Bnode ));
do{
      printf("\n1:Create Tree:");
      printf("\n2:Travel Tree:(DLR)");
      printf("\n3:Travel Tree:(LDR)");
      printf("\n4:Travel Tree:(LRD)");
      printf("\n5:Travel Tree:(LDR)(FeiDiGui):");
      printf("\n6:Travel Tree:(DLR)(FeiDiGui):");
      printf("\n7:Degrees  of Tree:(DiGui);");
      printf("\n8:Degrees  of Tree:(FeiDiGui);");
      printf("\nChoose :");
      scanf("%d",&j);
      switch(j){
      case 1:creat_tree(&root);
      break;/* 取根指针变量的地址,生成二叉树 */
      case 2:preorder1(root);    break;   /* 前序遍历二叉树 */
      case 3:preorder2(root);    break;  /* 中序遍历二叉树 */
      case 4:preorder3(root);    break;  /* 后序遍历二叉树 */
      case 5:preorder4(root);    break;  /* 非递归中序遍历二叉树 */
      case 6:preorder5(root);    break;  /* 非递归先序遍历二叉树 */
      case 7:node[3] =nodes(root);
                   printf("SIZE OF TREE=%d",node[3] ) ;  /* 递归算法求节点总数*/
                   node[0] =nodeO(root);
                   printf("Degree=0:%d",node[0] ) ;
                   node[1] =node1(root);
                   printf("Degree=1:%d",node[1] ) ;
                   node[2] =node2(root);
                   printf("Degree=2:%d",node[2] ) ;break;
      case 8: degrees(root); break;
      default:printf("Choose from 1,2,3,4...8");break;
     }
printf("\nCONTINUE?(Y/N)");
while(isspace(CH=getchar()));
}while(CH!='N'||CH!='n');
printf("\nbyebye!");
}

[em16][em16][em16][em16]

回复列表 (共19个回复)

11 楼

后序非递归算法:
void PostOrder(BiTree T,void (*visit)(char))
{
    BiTree p,temp;
    stack S;
    initstack(S);
    p=T;
    if(p==NULL) return;
    else{
        push(S,p);
        do{
            if(p->lchild!=NULL){
                p=p->lchild;
                push(S,p);
            }
            else{
                if(p->rchild!=NULL){
                    p=p->rchild;
                    push(S,p);
                }
                else{
                    visit(p->data);
                    while(1){
                        pop(S,temp);
                        if(emptystack(S)) return;
                        gettop(S,temp);
                        if(temp->rchild!=NULL&&p!=temp->rchild){
                            p=temp->rchild;
                            push(S,p);
                            break;
                        }
                        else{
                            visit(temp->data);
                            p=temp;
                        }
                    }
                }
            }
        }while(!emptystack(S));
    }
}
    

12 楼

要认真分析一下楼主的程序,学一些东西

13 楼

void degrees(Bnode *root)在编译的时候   说变量声明错误

14 楼

今年刚开的数据结构,我感觉很抽象、很难学;因为上学期我们开的是c++,而今年开的是c语言版本的数据结构,总不能写/读一些完整的算法题。郁闷之余,我来到了这里,真的是大开眼界,不过还是对有注释的情有独钟。

15 楼

受益很大。谢谢了

16 楼


[em13]

17 楼




楼主你太有才了~~~~~~~美丽大方 国色天香 倾城倾国 沉鱼落雁 闭月羞花 
如花似玉 花容月貌 美若天仙 艳如桃李 
蛾眉曼睩 蛾眉螓首 皓齿朱唇 韶颜稚齿 
仙姿佚貌 梳云掠月 贤贤易色 云容月貌 
天资国色 绝色倾城 眉目如画, 
花容月貌, 貌美如花, 如花似玉, 
玉洁冰清, 冰雪聪明, 明艳动人, 
人见人爱, 倾国倾城, 沉鱼落雁, 
闭月羞花, 人间尤物, 出尘脱俗, 
吹弹即破, 白璧无瑕, 美艳绝伦, 
楚楚可人, 人淡如菊, 娇艳如花, 
至真至纯, 尽善尽美,美若天仙, 
温文尔雅, 品貌端庄, 丽质天成, 
窈窕淑女, 天姿绝色, 国色天香, 
风姿绰约, 风华绝代, 语笑嫣然, 
含苞待放, 娇艳欲滴, 玲珑剔透, 
人间极品, 含苞待放, 娇艳欲滴, 
玲珑剔透, 美若天仙, 独孤一枝, 
闭月羞花, 沉鱼落雁 

18 楼

当然,唯一遗憾是,您不是女的

19 楼

很不错,LZ写出了一般思路,可提供参考!

我来回复

您尚未登录,请登录后再回复。点此登录或注册