hdu3791 二叉搜索树(BST的建立)

来源:互联网 发布:url短网址生成 java 编辑:程序博客网 时间:2024/05/21 00:18


http://acm.hdu.edu.cn/showproblem.php?pid=3791

题意:给你一个标准串,此串可以构成一个二叉搜索树,接着是n个比较串,求问这两个串是否可以构成同一个二叉搜索树。


思路:好好理解下二叉搜索树定义,一个串可以描述一个二叉搜索树,但是一个二叉搜索树通常都不止一种表示方法。二叉搜索树通常都是插入的节点和当前根比较大小,从而判断插入的位置,但是插入左方并不影响右方的排列,所以序列总数大概就是左边节点和右边节点的排列组合。

通过对一个字符串中每个字符的插入操作构成一棵树,然后对这个树进行前序遍历得出遍历序列,最后对此序列进行比较即可。


值得注意的有两点,一个是结构体容易用混,看看这个,差不多对结构体指针稍微熟悉下。指针是需要被赋值后才可以使用;

另一个是插入操作,如果为空则创建新节点,不为空则扩充左右子树,注意不对根进行处理。


还是得多熟悉。


#include <stdio.h>#include <algorithm>#include <string.h>#include <math.h>#include <iostream>using namespace std;typedef long long ll;const int N = 12;typedef struct Tree{    Tree *left;    Tree *right;    int val;}Tree;Tree *root;int stand[N], cmp[N], cnt, len;Tree *creat(int num){    Tree *node = (Tree*)malloc(sizeof(Tree));    node->left = NULL;    node->right = NULL;    node->val = num;    return node;}Tree *insertt(Tree *node, int num){    if(node == NULL)    {        node = creat(num);    }    else    {        if(num < node->val) node->left = insertt(node->left, num);        else if (num > node->val) node->right = insertt(node->right, num);    }    return node;}void preorder(Tree *posttree){    if(posttree != NULL)    {        cmp[cnt++] = posttree->val;        preorder(posttree->left);        preorder(posttree->right);    }}void build(char *s){    root = NULL;    len = strlen(s);    cnt = 0;    for(int i = 0; i < len; i++)    {        int num = s[i]-'0';        root = insertt(root, num);    }}int main(){   // freopen("in.txt", "r", stdin);    int n;    char s[N];    while(~scanf("%d", &n))    {        if(n == 0) break;        scanf("%s", s);        build(s);        preorder(root);        memcpy(stand, cmp, sizeof(cmp));        while(n--)        {            scanf("%s", s);            build(s);            preorder(root);            bool ans = true;            for(int i = 0; i < len; i++)            {                if(stand[i] != cmp[i])                {                    ans = false;                    break;                }            }            if(ans) printf("YES\n");            else printf("NO\n");        }    }}


0 0
原创粉丝点击