⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 twol.cpp

📁 二叉树的建立与遍历 可实现: (1)树的创建采用先序方式
💻 CPP
字号:
#include<stdio.h>
#include <stdlib.h>
#define ok 1
#define OVERFLOW -2
#define error 0

typedef struct Bnode
{
  int data;
  struct Bnode *lchild;
  struct Bnode *rchild;
                
}Bnode,* Btree;


int creatBtree(Btree &P)
{
 int data;    
 scanf("%d",&data);
 if(data==0)
 P=NULL;
 else 
 {
  if(!(P =(Bnode*)malloc(sizeof(Bnode))))
  exit(OVERFLOW);
  P->data = data;
  creatBtree(P->lchild);   
  creatBtree(P->rchild);   
 }
 return ok;    
}



int print(int a)
{
 printf("%d\n",a);
 return ok;         
}

void preorder(Btree P,int k)
{
 if(P)
 {
   	int i;
	for(i=0;i<=k;i++)
		printf(" ");
	printf("%d\n",P->data);
    k=k+2;
    preorder(P->lchild,k);
    preorder(P->rchild,k);
  }  
}





int inorder(Btree P,int(*visit)(int a))
{
 if(P)
 {
  if(inorder(P->lchild,visit))
    if(visit(P->data))     
      if(inorder(P->rchild,visit))
          return ok;
          return error;  
 }    
 else 
 return ok;       
}


int postorder(Btree P,int(*visit)(int a))
{
 if(P)
 {
  if(postorder(P->lchild,visit))
   if(postorder(P->rchild,visit))
    if(visit(P->data))     
      return ok;
      return error;  
 }    
 else 
 return ok;       
}


int DestroyBtree(Btree P,int (*visit)(Btree))
{
	if(P)
	{
		if(DestroyBtree(P->lchild,visit))
			if(DestroyBtree(P->rchild,visit))
				if(visit(P))
					return ok;
                    return error;
	}
    else 
    return ok;
}


int Destroy(Btree P)
{
	free(P);
	return ok;
}


void disBtree(Btree P)
{
// int data;
 if(P!=NULL)
 {
   printf("%d",P->data);      
   if (P->lchild!=NULL || P->rchild!=NULL)
   {
      printf("(");
      disBtree(P->lchild);
      if(P->rchild!=NULL)                 
      printf(",");
      disBtree(P->rchild);
      printf(")");                 
   }             
 }   
}

void menu(Btree P)
{
  int x;
  printf("\n\n请输入选项:\n");
  printf("1.  先序遍历树并输出\n");
  printf("2.  中序遍历树并输出\n");
  printf("3.  后序遍历树并输出\n");
  printf("4.  销毁树\n");
  printf("5.  退出\n");
  printf("您的选择是(1~5):");  
  scanf("%d",&x);
  int k=1;
  switch(x)
  {
   case 1 : printf("\n结果如下:\n"); preorder(P,k); menu(P);break;       
   case 2 : printf("\n结果如下:\n"); inorder(P,print); menu(P);break;
   case 3 : printf("\n结果如下:\n"); postorder(P,print); menu(P);break;
   case 4 : printf("\n已销毁\n"); DestroyBtree(P,Destroy); break;
   case 5 :  exit(0);        
  }  
    
}



void main()
{
 void menu(Btree);    
 void disBtree(Btree P);    
 int DestroyBtree(Btree P,int (*visit)(Btree));   
 void preorder(Btree P,int k);    
 int inorder(Btree P,int(*visit)(int a));   
 int postorder(Btree P,int(*visit)(int a));
 int creatBtree(Btree &P);
 int print(int a);
     
 printf("***********************************欢迎使用************************************\n\n");
 printf("请按先序输入二叉树结点的数值(0表示左右子树为空),用回车隔开:\n");
 Btree P;
 creatBtree(P);
 printf("\n您输入的树为(先序):\n");
 disBtree(P);
 printf("\n");
 menu(P);
              
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -