SDUTOJ2128 二叉排序树

题目连接:点击打开链接

在树结构中,有一种特殊的二叉树叫做排序二叉树,直观的理解就是——(1).每个节点中包含有一个关键值 (2).任意一个节点的左子树(如果存在的话)的关键值小于该节点的关键值 (3).任意一个节点的右子树(如果存在的话)的关键值大于该节点的关键值。现给定一组数据,请你对这组数据按给定顺序建立一棵排序二叉树,并输出其中序遍历的结果。

输入

输入包含多组数据,每组数据格式如下。

第一行包含一个整数n,为关键值的个数,关键值用整数表示。(n<=1000)

第二行包含n个整数,保证每个整数在int范围之内。

输出

为给定的数据建立排序二叉树,并输出其中序遍历结果,每个输出占一行。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;

struct node
{
    int data;
    node *l,*r;
};
int n;
void Insert(node *&t,int data)
{
    if(t==NULL)
    {
        t = new node;
        t->l = t->r = NULL;
        t->data = data;
    }
    else
    {
        if(data < t->data)
            Insert( t->l , data);
        else
            Insert( t->r , data);
    }
}

node *root;

void Creat()
{
    for(int i=0; i<n; i++)
    {
        int x;
        scanf("%d",&x);
        Insert(root,x);
    }
}
int stk[1001],l;
void mid(struct node *T)
{
    if(T!=NULL)
    {
        mid(T->l);
        stk[l++] = T->data;

        mid(T->r);
    }
}
void Delete(struct node *t)
{
    if(t!=NULL)
    {
        Delete(t->l);
        Delete(t->r);
    }
    delete(t);
}

int main()
{

        while(scanf("%d",&n)!=EOF)
        {
            l = 0;
            root = NULL;
            Creat();
            mid(root);
            Delete(root);
            for(int i = 0;i<l-1;i++)
            {
                printf("%d ",stk[i]);
            }
            printf("%d\n",stk[l-1]);
        }
    return 0;
}
时间: 2024-11-04 15:41:25

SDUTOJ2128 二叉排序树的相关文章

【LeetCode】96. Unique Binary Search Trees-唯一二叉排序树的个数

一.描述: 二.思路: BST(二叉排序树):中序遍历的结果为非递减序列,并且节点(个数和值)相同的不同二叉树的中序遍历结果都相同: 当左子树的节点个数确定后,右子树的个数也随之确定: 当节点个数为0或1时,二叉树只有1种,表示为f(0)=1,f(1)=f(0)*f(0): 当节点个数为2时,总的种类数=左子树为空f(0)*右子树不为空f(1)+左子树不为空f(1)*右子树为空f(0),即f(0)*f(1)+f(1)*f(0)=2种: 当节点个数为3时,有左子树为空f(0)*右子树不为空f(2)

16.二叉排序树

转载请表名出处:http://blog.csdn.net/u012637501 一.二叉排序树 如果要查找的数据集是有序线性表且是顺序存储的,查找可以用折半.插值.斐波那契等查找算法来实现.然后,由于有序,当我们在插入和删除操作上,就需要耗费大量的时间.下面将要学习的二叉排序树,就是一种既可以使得插入和删除效率不错,又可以比较高效率地实现查找的算法.为此,构造一棵二叉排序树的目的并不是为了排序,而是为了提供查找和插入删除关键字的速度. 1.二叉排序树概念 二叉排序树(Binary Sort Tr

腾讯笔试题:满二叉排序树,任给3个子节点,找他们最大的公共父节点

腾讯笔试题出现了和这个类似的题目,没做出来,现在来好好解决这个问题吧,先从基本的开始. 先吐槽一下:感觉算法设计什么的,真的超级难,也许是我头脑太笨,转不过弯来吧,呵呵. 题目是这样的:一棵满二叉排序树,有K层,节点的值依次为 1~2k-1.现在告诉你树的高度是4层,给定你3个节点,比如9,11, 13,那么最大的公共父节点是12. 现在想起来这题我已经想出来一半了呀,但是大概人在紧张的时候大脑会思维短路,跳不出原有的思维陷阱.想法是这样的: 1. 首先是从根节点开始,如果给的三个叶节点的值其中

九度oj 题目1467:二叉排序树

题目1467:二叉排序树 时间限制:1 秒 内存限制:128 兆 特殊判题:否 提交:4102 解决:1644 题目描述: 二叉排序树,也称为二叉查找树.可以是一颗空树,也可以是一颗具有如下特性的非空二叉树: 1. 若左子树非空,则左子树上所有节点关键字值均不大于根节点的关键字值:        2. 若右子树非空,则右子树上所有节点关键字值均不小于根节点的关键字值:        3. 左.右子树本身也是一颗二叉排序树. 现在给你N个关键字值各不相同的节点,要求你按顺序插入一个初始为空树的二叉

[二叉查找树] 二叉排序树

题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入 输入第一行包括一个整数n(1<=n<=100).接下来的一行包括n个整数. 输出 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序.中序和后序遍历.每种遍历结果输出一行.每行最后一个数据之后有一个空格. 样例输入 1 2 2 8 15 4 21 10 5 39 样例输出 2 2 2 8 15 8 15 15 8 21 10 5 39 5 10 21 39 5 10 39 21

二叉排序树(BST)的建立

给一个非递归的吧. 1 /* 2 已知,二叉树存储结构定义见bstree.h,请编写一个算法函数bstree creatBstree(int a[],int n), 3 以数组a中的数据作为输入建立一棵二叉排序树,并将建立的二叉排序树进行中序遍历. 4 (提示,a中的原始数据可从data1.txt中读入,实验代码详见lab9_05.c) 6 */ 7 8 #include "Arrayio.h" 9 #include "bstree.h" 10 #define N

重温数据结构:二叉排序树的查找、插入、删除

读完本文你将了解到: 什么是二叉排序树 Binary Sort Tree BST 二叉排序树的关键操作 查找 插入 删除 运行代码测试 一道面试题 总结 Thanks 我们知道,二分查找可以缩短查找的时间,但是有个要求就是 查找的数据必须是有序的.每次查找.操作时都要维护一个有序的数据集,于是有了二叉排序树这个概念. 上篇文章 我们介绍了 二叉树 的概念,二叉树有左右子树之分,想必在区分左右子树时有一定的规则. 现在我们来介绍二叉树的一种特殊形式 - 二叉排序树,了解它的区分策略及常用操作. 什

二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++

一.数据结构背景+代码变量介绍 二叉查找树,又名二叉排序树,亦名二叉搜索树 它满足以下定义: 1.任意节点的子树又是一颗二叉查找树,且左子树的每个节点均小于该节点,右子树的每个节点均大于该节点. 2.由1可推出,任意节点的左孩子小于该节点,右孩子大于该节点 以上讨论的是左(右)孩子(子树)存在的情况 它的中序遍历是一个升序的排序 在参考代码中,我们定义有: 主程序中,k代表插入或删除或查找的节点的值 root,根节点位置:a[i],第 i 号节点的值:cl[i],第 i 号节点左孩子的位置:cr

【转】B树、B-树、B+树、B*树、红黑树、 二叉排序树、trie树Double Array 字典查找树简介

B  树 即二叉搜索树: 1.所有非叶子结点至多拥有两个儿子(Left和Right): 2.所有结点存储一个关键字: 3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树: 如: B树的搜索,从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中:否则,如果查询关键字比结点关键字小,就进入左儿子:如果比结点关键字大,就进入右儿子:如果左儿子或右儿子的指针为空,则报告找不到相应的关键字: 如果B树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性