九度题目1201:二叉排序树

本文介绍如何根据一系列整数建立二叉排序树,并进行前序、中序和后序遍历。示例输入包含5个整数,输出展示了不同遍历顺序的结果。文章强调了二叉排序树的特性,并邀请读者对内容提出意见和建议,旨在共同学习进步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接:http://ac.jobdu.com/problem.php?pid=1201

题目描述:
    输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
    输入第一行包括一个整数n(1<=n<=100)。
    接下来的一行包括n个整数。
输出:
    可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
    每种遍历结果输出一行。每行最后一个数据之后有一个空格。
样例输入:
5
1 6 5 9 8
样例输出:
1 6 5 9 8 
1 5 6 8 9 
5 8 9 6 1 
提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。


就是前面博客里写的二叉树的创建和遍历,只不过现在是二叉排序树,注意二叉排序树的性质就完了

#include <stdio.h>
#include <stdlib.h>
  
struct Tree{
    struct Tree *lchild,*rchild;
    int data;
}; 
  
struct Tree * insertTree(struct Tree *root,int val){
    if(root==NULL){
       root=(struct Tree*)malloc(sizeof(struct Tree));
       root->data=val;
       root->lchild=root->rchild=NULL;
       return root;
    }
    else if(val<root->data){
        root->lchild=insertTree(root->lchild,val);
    }
    else if(val>root->data){
        root->rchild=insertTree(root->rchild,val);
    }
    return root;
}
  
void preOrder(struct Tree *root){    //根左右 
    printf("%d ",root->data);
    if(root->lchild!=NULL){
         preOrder(root->lchild);
    }
    if(root->rchild!=NULL){
         preOrder(root->rchild);
    }
} 
  
void inOrder(struct Tree *root){    //左根右 
    if(root->lchild!=NULL){
         inOrder(root->lchild);
    }
    printf("%d ",root->data);
    if(root->rchild!=NULL){
         inOrder(root->rchild);
    }
}
  
void postOrder(struct Tree *root){    //左右根 
    if(root->lchild!=NULL){
         postOrder(root->lchild);
    }
    if(root->rchild!=NULL){
         postOrder(root->rchild);
    }
    printf("%d ",root->data);
}
  
int main(int argc, char *argv[])
{
  int n,i;
  struct Tree *root;
  while(scanf("%d",&n)!=EOF){
     root=NULL;
     for(i=0;i<n;i++){
        int val;
        scanf("%d",&val);
        root=insertTree(root,val);  
     }
      preOrder(root);
      printf("\n");
      inOrder(root);
      printf("\n");
      postOrder(root);
      printf("\n");
  }
  return 0;
}



如果文章有什么错误或者有什么建议,欢迎提出,大家共同交流,一起进步

文章转载请注明出处,请尊重知识产权

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值