比较两个二叉排序树是否一样

题目描述:

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

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

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

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

    

    由于数据量比较的小,所以可以采用空间换取时间的方法,我们这里并没有构建二叉树,而是使用数组存储输入的value。

如果父节点的数组索引是index。那么它的左孩子的数组索引就是2*index + 1。右孩子的数组索引为2*index。当然也可以反过来。

代码实现如下:

 1 #include <iostream>
 2 #define MAX 1024
 3 using namespace std;
 4 
 5 //strinput用来接收输入的字符串。sourceTree是其他的和它比较的树。generTree是待比较的输入树。这里树使用数组存储。
 6 char sourceTree[MAX] , generTree[MAX], strinput[10];
 7 
 8 bool insertNode(char tree[], char c)
 9 {
10     int index = 1;//从下标为1开始构建
11     bool mark = true;
12 
13     while (1)
14     {
15         if (tree[index] == '\0')//还没有填入字符
16         {
17             tree[index] = c;
18             if (tree[index] != sourceTree[index])//比较新构建的树和原来的是否一样
19             {
20                 mark = false;                
21             }
22             break;
23         }
24 
25         if (tree[index] < c)
26         {
27             index = index * 2 + 1;
28         }
29         else
30         {
31             index = index * 2;
32         }
33     }
34     return mark;
35 
36 }
37 
38 bool buildTree(char tree[], char strinput[], int len)
39 {
40     int i;
41     bool mark = true;
42 
43     for (i = 0; i < len; i++)
44     {
45         //每调用一次为数组赋一个值
46         mark = insertNode(tree, strinput[i]);
47         if (!mark)
48         {
49             break;
50         }
51     }
52     return mark;
53 }
54 int test()
55 {
56     int n;
57     bool mark;
58     while (cin >> n && n)
59     {
60         cin >> strinput;
61         int len = strlen(strinput);
62         //初始化
63         memset(sourceTree, 0, sizeof(sourceTree));
64         //建立原始的树,即其他的要和它进行比较
65         buildTree(sourceTree, strinput, len);
66         while (n--)
67         {
68             cin >> strinput;
69             len = strlen(strinput);
70             mark = true;
71             //初始化
72             memset(generTree, 0, sizeof(generTree));
73             //输入的待比较的树
74             mark = buildTree(generTree, strinput, len);
75             if (mark)
76             {
77                 cout << "YES" << endl;
78             }
79             else
80             {
81                 cout << "NO" << endl;
82             }
83         }
84     }
85     return 0;
86 }

 

转载于:https://www.cnblogs.com/leewhite/p/5342403.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值