二叉树是笔试面试中考试最频繁的数据结构之一,主要包括,程序建立一个二叉树,三种次序遍历二叉树,返回叶子节点的数目,求二叉树节点的总数等。建立一个二叉树节点的数据结构

二叉树是笔试面试中考试最频繁的数据结构之一,主要包括,程序建立一个二叉树,三种次序遍历二叉树,返回叶子节点的数目,求二叉树节点的总数等。建立一个二叉树节点的数据结构

typedef struct Node
{
int data;
struct Node *left,*right;
}Node;,结构体内包括数据,左子树,又子树;

一、建立二叉树的程序代码如下


[cpp]  Node *CreatBTree() //建立二叉树  

    Node *t; 
    int x; 
    scanf("%d",&x); 
    if(x==0) 
    { 
        t=NULL; 
    } 
    else 
    { 
        t=(Node*)malloc(sizeof(Node)); 
        t->data=x; 
        printf("\n请输入%d结点的左子结点:",t->data ); 
        t->left=CreatBTree(); 
        printf("\n请输入%d结点的右子结点:",t->data ); 
        t->right=CreatBTree(); 
    } 
    return t; 

Node *CreatBTree() //建立二叉树
{
 Node *t;
 int x;
 scanf("%d",&x);
 if(x==0)
 {
  t=NULL;
 }
 else
 {
  t=(Node*)malloc(sizeof(Node));
  t->data=x;
  printf("\n请输入%d结点的左子结点:",t->data );
  t->left=CreatBTree();
  printf("\n请输入%d结点的右子结点:",t->data );
  t->right=CreatBTree();
 }
 return t;
}

二、前序遍历二叉树


[cpp] void preVisit(Node *T) 

    if(T==NULL) return; 
    else 
    { 
        printf("%3d",T->data); 
        preVisit(T->left); 
        preVisit(T->right); 
    } 

void preVisit(Node *T)
{
 if(T==NULL) return;
 else
 {
  printf("%3d",T->data);
  preVisit(T->left);
  preVisit(T->right);
 }
}
三、中序遍历二叉树


[cpp] void middVisit(Node *T) 

    if(T==NULL) return; 
    else 
    { 
        middVisit(T->left); 
        printf("%3d",T->data); 
        middVisit(T->right); 
    } 

void middVisit(Node *T)
{
 if(T==NULL) return;
 else
 {
  middVisit(T->left);
  printf("%3d",T->data);
  middVisit(T->right);
 }
}
四、后序遍历二叉树


[cpp]  void lastVisit(Node *T) 

    if(T==NULL) return; 
    else 
    { 
        lastVisit(T->left); 
        lastVisit(T->right); 
        printf("%3d",T->data); 
    } 

void lastVisit(Node *T)
{
 if(T==NULL) return;
 else
 {
  lastVisit(T->left);
  lastVisit(T->right);
  printf("%3d",T->data);
 }
}
五、返回叶子节点数目


[cpp]  int leafnum(Node *T) 

    if (!T) 
    { 
        return 0; 
    } 
    else if ((!T->left)&&(!T->right)) 
    { 
        return 1; 
    } 
    else 
    { 
        return ((leafnum(T->left)+leafnum(T->right))); 
    } 

int leafnum(Node *T)
{
 if (!T)
 {
  return 0;
 }
 else if ((!T->left)&&(!T->right))
 {
  return 1;
 }
 else
 {
  return ((leafnum(T->left)+leafnum(T->right)));
 }
}
六、返回节点总数目


[cpp] view plaincopyprint?int Nodenum(Node *T) 

    if (T) 
    { 
        return 1+Nodenum(T->left)+Nodenum(T->right); 
    } 
    if (T==NULL) 
    { 
        return 0; 
    } 
 

int Nodenum(Node *T)
{
 if (T)
 {
  return 1+Nodenum(T->left)+Nodenum(T->right);
 }
 if (T==NULL)
 {
  return 0;
 }

}
七、测试程序;[cpp] int menu(); 
void main() 

    Node *T=NULL; 
    int choice; 
    do{ 
        choice=menu(); 
        if(choice==1) 
        { 
            printf("二叉树的建立,以输入“0”表示结束:!\n"); 
            printf("请输入根结点:\n"); 
            T=CreatBTree(); 
            printf("二叉树成功建立"); 
        } 
        else if(choice==2) 
        { 
            printf("先序遍历二叉树 :\n"); 
            preVisit(T); 
        } 
        else if(choice==3) 
        { 
            printf("中序遍历二叉树:\n"); 
            middVisit(T); 
        } 
        else if(choice==4) 
        { 
            printf("后序遍历二叉树 :\n "); 
            lastVisit(T); 
        } 
        else if(choice==5) 
        { 
            int ct=10; 
            ct=leafnum(T); 
            printf(" 二叉树的叶子结点数为 : \n"); 
            printf("%d\n",ct); 
             
        } 
        else if(choice==7) 
        { 
            int count=Nodenum(T); 
            printf("该二叉树总共有%d个结点。\n",count); 
        } 
        else if(choice==8) 
        exit(0); 
    }while(choice<=8); 

int menu();
void main()
{
 Node *T=NULL;
 int choice;
 do{
  choice=menu();
  if(choice==1)
  {
   printf("二叉树的建立,以输入“0”表示结束:!\n");
   printf("请输入根结点:\n");
   T=CreatBTree();
   printf("二叉树成功建立");
  }
  else if(choice==2)
  {
   printf("先序遍历二叉树 :\n");
   preVisit(T);
  }
  else if(choice==3)
  {
   printf("中序遍历二叉树:\n");
   middVisit(T);
  }
  else if(choice==4)
  {
   printf("后序遍历二叉树 :\n ");
   lastVisit(T);
  }
  else if(choice==5)
  {
   int ct=10;
   ct=leafnum(T);
   printf(" 二叉树的叶子结点数为 : \n");
   printf("%d\n",ct);
   
  }
  else if(choice==7)
  {
   int count=Nodenum(T);
   printf("该二叉树总共有%d个结点。\n",count);
  }
  else if(choice==8)
  exit(0);
 }while(choice<=8);
}
[cpp] int menu() 

        int choice; 
        printf("\n"); 
        printf(" 二叉树 \n"); 
        printf(" ***************************\n"); 
        printf(" * *\n"); 
        printf(" * 主菜单 *\n"); 
        printf(" * 1 建立二叉树 *\n"); 
        printf(" * 2 先序遍历二叉树 *\n"); 
        printf(" * 3 中序遍历二叉树 *\n"); 
        printf(" * 4 后序遍历二叉树 *\n"); 
        printf(" * 5 二叉树的叶子结点数 *\n"); 
        printf(" * 7 二叉树的所有结点数 *\n"); 
        printf(" * 8 退出程序运行 *\n"); 
        printf(" ****************************\n"); 
        printf(" 请输入您的选择(1,2,3,4,5,6,7,8): \n"); 
        scanf("%d",&choice); 
        return choice; 

int menu()
{
     int choice;
  printf("\n");
  printf(" 二叉树 \n");
  printf(" ***************************\n");
  printf(" * *\n");
  printf(" * 主菜单 *\n");
  printf(" * 1 建立二叉树 *\n");
  printf(" * 2 先序遍历二叉树 *\n");
  printf(" * 3 中序遍历二叉树 *\n");
  printf(" * 4 后序遍历二叉树 *\n");
  printf(" * 5 二叉树的叶子结点数 *\n");
  printf(" * 7 二叉树的所有结点数 *\n");
  printf(" * 8 退出程序运行 *\n");
  printf(" ****************************\n");
  printf(" 请输入您的选择(1,2,3,4,5,6,7,8): \n");
  scanf("%d",&choice);
  return choice;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值