04-树4 是否同一棵二叉搜索树

来源:互联网 发布:饥荒修改数据 编辑:程序博客网 时间:2024/05/23 20:36

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数NN (\le 1010)和LL,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出NN个以空格分隔的正整数,作为初始插入序列。最后LL行,每行给出NN个插入的元素,属于LL个需要检查的序列。

简单起见,我们保证每个插入序列都是1到NN的一个排列。当读到NN为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 23 1 4 23 4 1 23 2 4 12 12 11 20

输出样例:

YesNoNo

解:比较两个二叉树是否为同一个,除了建立两个二叉树来进行遍历比较外,还可以固定被比较的那个二叉树,比较的那个二叉树每输入一个数就比较一次,只要在被比较的二叉树上做好标记即可。递归是遍历二叉树的一个很好的工具。
调试代码记得多打印二叉树的状态。我当时错在check_tree函数中while中的if语句没有用else,导致判断时逻辑有漏。
代码:
#include <iostream>#include <stdlib.h>using namespace std;typedef struct node btree;struct node{int data;int flag;btree *left;btree *right;};btree* create_node(int data){btree *p = (btree*)malloc(sizeof(struct node));p->data = data;p->flag = 0;p->left = NULL;p->right = NULL;return p;}btree* add_node(btree *root, int data){if(root){if(data > root->data)root->right = add_node(root->right, data);elseroot->left = add_node(root->left, data);}else{root = create_node(data);}return root;}btree* create_tree(int len){btree *tree = NULL;int data;for(int i = 0; i < len; i++){cin>>data;if(tree){add_node(tree, data);}else{tree = create_node(data);}}return tree;}void print(btree *root){cout<<root->data<<' '<<root->flag;if(root->left)print(root->left);if(root->right)print(root->right);}int check_tree(btree *root, int data){int flag = 0;while(root->flag){if(root->data > data)root = root->left;else if(root->data < data)root = root->right;}if(root->data != data)flag = 1;elseroot->flag = 1;return flag;}void compare_tree(btree *root, int len){int flag = 0;int data;for(int i = 0; i < len; i++){cin>>data;if(check_tree(root, data))flag = 1;}if(flag)cout<<"No"<<endl;elsecout<<"Yes"<<endl;}void reset_flag(btree *root){if(root->left)reset_flag(root->left);if(root->right)reset_flag(root->right);root->flag = 0;}void free_tree(btree *root){if(root->left)free_tree(root->left);if(root->right)free_tree(root->right);free(root);}int main(){int N, L;cin>>N;btree *tree = NULL;while(N){cin>>L;tree = create_tree(N);for(int i = 0; i < L; i++){compare_tree(tree, N);reset_flag(tree);}free_tree(tree);cin>>N;}}

2017-5-2 待续
0 0
原创粉丝点击