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


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

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


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

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


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

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


还是得多熟悉。


#include 
#include 
#include 
#include 
#include 

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");
        }
    }
}


你可能感兴趣的:(hdu,数据结构-各种树)