九度题目1009:二叉搜索树

题目1009:二叉搜索树
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:4308
解决:1919
题目描述:
判断两序列是否为同一二叉搜索树序列
输入:
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:
如果序列相同则输出YES,否则输出NO

样例输入:
2
567432
543267
576342
0
样例输出:
YES
NO
来源:
2010年浙江大学计算机及软件工程研究生机试真题

 

 

 

静态二叉搜索树的非递归实现

思路:

由于仅仅只需要遍历二叉树即可,所以没有必要花费时间建立指针树,

只需要在相应位置储存数据遍历即可。

开一个一维数组,从a[1]开始存储,a[1]的左孩子是a[2],右孩子是a[3],

同理,a[2]的左孩子是a[4],右孩子是a[5],a[3]的左孩子是a[6],右孩子是a[7]

如图:

                    a[1]

            a[2]          a[3]

     a[4]   a[5]   a[6]    a[7]

可以得出结论,a[i]的左孩子是a[2*i],右孩子是a[2*i+1]。

首先将空的数组清为-1(输入值都是大于0的),然后对插入的

值判断,如果当前节点为-1,说明有空间,将数放在此位置即可。

如果当前节点不为-1,说明位置已被占,按照二叉排序树的定义,

我们根据它与此节点的大小来判断它往左还是右插
AC代码:

#include<stdio.h>
#include<string.h>
char s[100];
int a[100],b[100];
void CreatTree(char s[],int a[])
{
   int j,n=strlen(s);
   int i=0;
   while(i<n)
   {
      for(j=0;j<100;)
      {
          if(a[j]==-1)
          {
             a[j]=s[i]-'0';
             break;
          }
          else
          {
             if(a[j]>s[i]-'0')
             j=2*j;
             else
             j=2*j+1;
          }
      }
      i++;
   }
}
int main()
{
    int i,j,n,m;
    while(scanf("%d",&n),n!=0)
    {
       memset(s,0,sizeof(s));
       scanf("%s",s);
       for(i=1;i<100;i++)
       a[i]=-1;
       CreatTree(s,a);
       while(n--)
       {
          memset(s,0,sizeof(s));
          scanf("%s",s);
          for(i=1;i<100;i++)
          b[i]=-1;
          CreatTree(s,b);
          for(i=0;i<100;i++)
          if(a[i]!=b[i]) break;
          if(i==100)
          printf("YES\n");
          else
          printf("NO\n");
       }
    }
    return 0;
}
时间: 2024-08-25 11:49:33

九度题目1009:二叉搜索树的相关文章

[华为机试练习题]33.二叉搜索树

题目 描述: 判断两序列是否为同一二叉搜索树序列 题目类别: 树 难度: 中级 运行时间限制: 10Sec 内存限制: 128MByte 阶段: 入职前练习 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束. 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树. 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树. 输出: 如果序列相同则输出YES

二叉搜索树与双向链表的C++实现

题目:输入一颗二叉搜索树, 将该二叉搜索树转换成一个排序的双向链表. 要求不能创建任何新的结点, 只能调整数中结点的指针的指向. 方法: 使用中序遍历每一个结点, 并进行连接, 即左子树指前, 右子树指后, 并保存前一个节点. 本程序包含算法原理, 测试程序, 及 输出. 代码: /* * main.cpp * * Created on: 2014.6.12 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #i

剑指offer系列之二十五:二叉搜索树与双向链表

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 由于二叉搜索树的中序遍历就是排序的,如果是构造单链表,只需要一次中序遍历就可以了,但现在需要构造双链表,也就是在中序遍历的过程中需要设置每个节点的left与right指针,现在问题是如何设置这两个指针?二叉搜索树有一个特点,就是根节点的左子树上所有节点都比根节点的值小,而右子树上的所有节点的值都比根节点的值大,利用这个性质,当遍历根节点的左孩子的时候,可以继续把其当做左子

剑指offer系列之二十二:二叉搜索树的后续遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 此题仍然是对二叉树遍历方法的考察,但是与直接对遍历方法的考察不太一样,因为这里的输入是后续遍历的序列,所以要判断该序列是否是某二叉树的后续遍历结果,关键在于找出根节点,根节点的左子树和根节点的右子树,然后继续对左子树和右子树进行判断,直到全部元素访问完毕.这里很显然是一个递归的过程.由于后续遍历是先访问双亲节点,接着访问左孩子,再访问右孩子,所以需

二叉搜索树的插入与删除(详细解析)_C 语言

题目:创建一个类,类中的数据成员时一棵二叉搜索树,对外提供的接口有添加结点和删除结点这两种方法.用户不关注二叉树的情况.要求我们给出这个类的结构以及实现类中的方法. 思路添加结点:添加结点其实很容易,我们只需要找到结点所行对应的位置就可以了,而且没有要求是平衡的二叉搜索树,因此每次添加结点都是在叶子结点上操作,不需要修改二叉搜索树整体的结构.要找出添加节点在二叉搜索树中的位置,可以用一个循环解决.判断插入结点与当前头结点的大小,如果大于头结点则继续搜索右子树,如果小于头结点则继续搜索左子树.直到

算法起步之二叉搜索树

原文:算法起步之二叉搜索树         学习二叉搜索树之前,我们先复习一下树的相关知识,数是几种经典的数据结构之一,树其实就是维护了一对多的关系,一个节点可以有多个孩子,但是每个节点至多只有一个双亲.如何去描述存储一棵树呢,这里方法有很多,数组.链表.十字链表等等.这里我们主要研究二叉树,二叉树是树的一种特殊形式,节点至多只有两棵子树,有左右之分次序不能任意颠倒.二叉树还有一个性质就是叶子节点的个数=度为2的节点+1 .二叉搜索树又叫二叉排序树或二叉查找树.他比二叉树又加个1个性质,就是左子

《剑指offer》-二叉搜索树与双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 题目的描述不是很习惯.题目的意思是把二叉树从左到右遍历,相当于双向链表的遍历. 其实就是让二叉树在x方向上的投影点,顺序输出.那么其实就是中序遍历.递归版本如下: struct TreeNode{ int val; struct TreeNode* left; struct TreeNode* right; TreeNode(int x) : val(x), left(NULL),

c++-二叉搜索树的遍历问题

问题描述 二叉搜索树的遍历问题 #include<iostream> #include<string> using namespace std; class node{ public: string name; string keyword; node* left; node* right; node(string a = 0, string b = 0, node* c = 0, node* d = 0) : name(a), keyword(b), left(c), right

纸上谈兵: 树, 二叉树, 二叉搜索树[转]

树的特征和定义 树(Tree)是元素的集合.我们先以比较直观的方式介绍树.下面的数据结构是一个树: 树有多个节点(node),用以储存元素.某些节点之间存在一定的关系,用连线表示,连线称为边(edge).边的上端节点称为父节点,下端称为子节点.树像是一个不断分叉的树根. 每个节点可以有多个子节点(children),而该节点是相应子节点的父节点(parent).比如说,3,5是6的子节点,6是3,5的父节点:1,8,7是3的子节点, 3是1,8,7的父节点.树有一个没有父节点的节点,称为根节点(