二叉排序树

简介: 二叉排序树

二叉排序树

Time Limit: 1000 ms Memory Limit: 65536 KiB

SubmitStatistic

Problem Description

二叉排序树的定义是:或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 今天我们要判断两序列是否为同一二叉排序树

Input

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。

接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉排序树。

接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉排序树。(数据保证不会有空树)

Output

 

Sample Input

2

123456789

987654321

432156789

0

Sample Output

NO

NO

Hint

 

Source

思路:和上一个一样,套模板建立二叉排序树,比较树的数值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node
{
    char data;
    struct node *lc;
    struct node *rc;
};
struct node *creat(struct node *root, int x)
{
    if(root == NULL)
    {
        root = (struct node *)malloc(sizeof(struct node));
        root->lc = NULL;
        root->rc = NULL;
        root->data = x;
    }
    else
    {
        if(x > root->data)
        {
            root->rc = creat(root->rc, x);
        }
        else
        {
            root->lc = creat(root->lc, x);
        }
    }
    return root;
};
int flag;
void bijiao(struct node *root, struct node *root1)
{
    if(root != 0 && root1 != 0)
    {
        if(root->data != root1->data)
        {
            flag = 1;
            return;
        }
        bijiao(root->lc, root1->lc);
        bijiao(root->rc, root1->rc);
    }
}
int main()
{
    int n, i, len1, len2;
    char a[11], b[11];
    struct node *root;
    struct node *root1;
    while(scanf("%d", &n) != EOF)
    {
        if(n == 0)
        {
            break;
        }
        else
        {
            scanf("%s", a);
            len1 = strlen(a);
            root = NULL;
            for(i = 0; i < len1; i++)
            {
                root = creat(root, a[i]);
            }
            while(n--)
            {
                flag = 0;
                scanf("%s", b);
                len2 = strlen(b);
                root1 = NULL;
                for(i = 0; i < len2; i++)
                {
                    root1 = creat(root1, b[i]);
                }
                bijiao(root, root1);
                if(flag == 0)
                {
                    printf("YES\n");
                }
                else
                {
                    printf("NO\n");
                }
            }
        }
    }
    return 0;
}


相关文章
|
3月前
|
API 调度
二叉排序树
二叉排序树
55 0
|
8月前
|
数据格式
树结构练习——排序二叉树的中序遍历
树结构练习——排序二叉树的中序遍历
|
存储 算法 关系型数据库
有了二叉树,平衡二叉树为什么还需要红黑树
有了二叉树,平衡二叉树为什么还需要红黑树
111 0
有了二叉树,平衡二叉树为什么还需要红黑树
|
算法
二叉搜索树、平衡二叉树
一、二叉搜索树 这里我们不用太多书面化的语言来定义,笔者认为在讨论数据结构、算法相关的内容时用太多书面化、学术化的语言是一种让人很烦的事情。咬文嚼字,不便于读者理解。 简单来说二叉树搜索树,其实就是用来做二分查找的一种二叉树。 特点是:根节点的左子树值均小于根节点的值,根节点的右子树值均大于根节点的值。 比如123 4 567建树的结果就是
61 0
剑指offer 58. 二叉搜索树的第k个结点
剑指offer 58. 二叉搜索树的第k个结点
58 0
|
存储
基于中序有序的二叉搜索树(上)
基于中序有序的二叉搜索树
|
存储
基于中序有序的二叉搜索树(下)
基于中序有序的二叉搜索树
|
存储 搜索推荐
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(下)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
【二叉树OJ题(二)】前序遍历&&中序遍历&&后序遍历&&另一颗树的子树&&二叉树遍历&&平衡二叉树(上)
|
JavaScript 前端开发 Java
搜索二叉树、完全二叉树、满二叉树、平衡二叉树
搜索二叉树、完全二叉树、满二叉树、平衡二叉树
135 0