二叉排序树 (九度教程第 35 题)

二叉排序树 (九度教程第 35 题)

时间限制:1 秒 内存限制:32 兆 特殊判题:否

1.题目描述:

输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
输入第一行包括一个整数 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
提示:
输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

2.基本思路
首先构造二叉排序树/二叉搜索树,每次向树中插入一个数值x只会存在以下三种情况,①当前的访问的结点为NULL,直接创建一个结点,并将x赋为该结点的值插入到树中。②x小于等于当前访问结点的值,递归当前结点的左子树。③x大于当前访问结点的值,递归当前结点的右子树。当所有的x插入完毕之后,二叉排序树便构建完毕,然后对其进行前序、中序和后序遍历即可。

3.代码实现

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

struct Node{
    Node* lchild;
    Node* rchild;
    int c;
}Tree[50];

int loc=0;
Node* create(){//申请一个结点空间并进行初始化同时返回指向该结点的指针
    Tree[loc].lchild = NULL;
    Tree[loc].rchild = NULL;
    loc++;
    return &Tree[loc];
}

Node* insertANumber(Node* T,int x){//在以T为根结点的树中出入数字x
    if(T==NULL){//若当前结点为空,创建一个结点并插入相应的数值
        T = create();
        T->c=x;
        return T;
    }
    if(x<=T->c){//若x小于等于当前值,插入T的左子树
       T->lchild = insertANumber(T->lchild,x);
    }

    if(x>T->c){//若x大于当前值,插入T的右子树
       T->rchild = insertANumber(T->rchild,x);
    }
    return T;
}


void preOrder(Node *r){//二叉树的前序遍历
    printf("%d ",r->c);
    if(r->lchild!=NULL){//左子树不为了空遍历左子树
        preOrder(r->lchild);
    }
    if(r->rchild!=NULL){//右子树不为空遍历右子树
        preOrder(r->rchild);
    }
}

void inOrder(Node *r){//二叉树的中序遍历
    if(r->lchild!=NULL){//左子树不为了空遍历左子树
        inOrder(r->lchild);
    }
    printf("%d ",r->c);
    if(r->rchild!=NULL){//右子树不为空遍历右子树
        inOrder(r->rchild);
    }
}

void postOrder(Node *r){//二叉树的后序遍历
    if(r->lchild!=NULL){//左子树不为了空遍历左子树
        postOrder(r->lchild);
    }
    if(r->rchild!=NULL){//右子树不为空遍历右子树
        postOrder(r->rchild);
    }
    printf("%d ",r->c);
}


int main()
{
    int n;
    int x;
    while(scanf("%d",&n)!=EOF){
        Node* T = NULL;
        loc=0;//初始分配的空间为大小为0
        for(int i=0;i<n;i++){
            scanf("%d",&x);
            T = insertANumber(T,x);
        }
        preOrder(T);
        printf("\n");
        inOrder(T);
        printf("\n");
        postOrder(T);
        printf("\n");
    }
    return 0;
}
/*
5
1 6 5 9 8
9
1 9 8 2 3 8 4 7 6
*/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值