华为机试题: 二叉搜索树

描述: 

判断两序列是否为同一二叉搜索树序列

 
题目类别:  树 
难度:  中级 
运行时间限制: 10Sec
内存限制: 128MByte
阶段:  入职前练习 
输入:  

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

 

 

 

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

 

 

 

接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

 
输出:  

如果序列相同则输出YES,否则输出NO

 
样例输入:
2
567432
543267
576342
0
                   
样例输出:
YES
NO
                   


#include <iostream>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <map>
#include <vector>

using namespace std;

typedef struct Node
{
    char data;
    struct Node* lchild;
    struct Node* rchild;

    /*构造函数*/
    Node(char d):data(d),lchild(NULL),rchild(NULL)
    {

    }
}NODE;

void InsertBiTreeNode(NODE* &root, char val)
{
    NODE* pNewNode = new NODE(val);

    /*如果是一个空树*/
    if(root == NULL)
    {
        root = pNewNode;
        return;
    }

    NODE* p = root, *pre = NULL;

    /*找到插入的节点*/
    while(p)
    {
        pre = p;
        if(p->data < val)
        {
            p = p->rchild;
        }
        else
        {
            p = p->lchild;
        }
    }

    /*将该节点插入*/
    if(pre->data > val)
    {
        pre->lchild = pNewNode;
    }
    else
    {
        pre->rchild = pNewNode;
    }

    return;
}

/*构建线索二叉树*/
NODE* createBiTree(string str)
{
    int i = 0, lens = str.size();
    NODE* root = NULL;

    for(i = 0; i < lens; i++)
    {
        InsertBiTreeNode(root,str[i]);
    }

    return root;
}

/*前序遍历二叉树*/
void preTree(NODE* root, string &ret)
{
    if(root == NULL)
    {
        return;
    }
    ret += root->data;
    preTree(root->lchild,ret);
    preTree(root->rchild,ret);
}
int main()
{
    int n = 0;

    while(cin >> n && n != 0)
    {
        string str,ret1;
        NODE* root1 = NULL;

        cin >> str;
        root1 = createBiTree(str);
        preTree(root1,ret1);

        while(n--)
        {
            cin >> str;

            NODE* pTree = NULL;
            pTree = createBiTree(str);

            string ret2;
            preTree(pTree,ret2);

            if(ret1 == ret2)
            {
                cout << "YES" << endl;
            }
            else
            {
                cout << "NO" << endl;
            }
        }
    }

    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dmfrm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值