zoukankan      html  css  js  c++  java
  • 判断两个二叉树是否相同

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

    输入格式:

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

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

    输出格式:

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

    输入样例:
    4 2
    3 1 4 2
    3 4 1 2
    3 2 4 1
    2 1
    2 1
    1 2
    0
    

    输出样例:
    Yes
    No
    No

      1 #include <iostream>
      2 using namespace std;
      3 
      4 struct treeNode{//抽象数据类型 
      5 	int v;
      6 	treeNode* left, *right;
      7 	bool flag;
      8 	treeNode(int v, treeNode* left, treeNode* right, bool flag){//构造函数 
      9 		this->v = v;
     10 		this->left = left;
     11 		this->right = right;
     12 		this->flag = flag;
     13 	}
     14 };
     15 
     16 treeNode* insert(treeNode* T, int V){
     17 	if(!T) T = new treeNode(V, NULL, NULL, false);     //插入每个结点,当t为空时是fasle 
     18 	else {
     19 		if(V > T->v)
     20 			T->right = insert(T->right, V);
     21 		else
     22 			T->left = insert(T->left, V);
     23 	}
     24 
     25 	return T;
     26 }
     27 treeNode* BuildTree(int N){
     28 	int V;
     29 	treeNode* T;
     30 
     31 	cin >> V;
     32 	T = new treeNode(V, NULL, NULL, false);//新增结点,并调用构造函数 
     33 	for(int i = 1; i < N; i++){
     34 		cin >> V;
     35 		T = insert(T,V);
     36 	}
     37 	return T;
     38 }
     39 int check(treeNode* T, int V){       //按顺序查找结点,如果经过的结点之前未经过,说明不是同一颗二叉树
     40 	if(T->flag){                //(因为结点本该插在这个未经过的结点的位置,但现在却经过了它)
     41 		if(V > T->v) check(T->right, V);
     42 		else if(V < T->v) check(T->left, V);
     43 		else return 0;
     44 	}
     45 	else {
     46 		if(V == T->v) {
     47 			T->flag = 1;
     48 			return 1;
     49 		}
     50 		else return 0;
     51 	}
     52 }
     53 int judge(treeNode* T, int N){
     54 	int V;
     55 	bool flag = false;
     56 	cin >> V;
     57 	if(T->v != V) flag = true;   //根结点不同,树不同
     58 	else T->flag = true;
     59 	for(int i = 1; i < N; i++){
     60 		cin >> V;
     61 		if(!flag && !check(T, V)) flag = true;    //即使已经得到判断,也要把剩下的结点接收完,防止影响下一组数据
     62 	}
     63 	if(flag) return false;
     64 	else return true;
     65 }
     66 void reset(treeNode* T){
     67 	if(T->left) reset(T->left);
     68 	if(T->right) reset(T->right);
     69 	T->flag = 0;
     70 }
     71 void freeTree(treeNode* T){
     72 	if(T->left) freeTree(T->left);
     73 	if(T->right) freeTree(T->right);
     74 	free(T);
     75 }
     76 int main(){
     77 	int N, L;
     78 	treeNode* T;
     79 	cin >> N;
     80 	while(N){
     81 		cin >> L;
     82 		T = BuildTree(N);
     83 		for(int i = 0; i < L; i++){
     84 			if(judge(T, N)) puts("Yes");
     85 			else puts("No");
     86 			reset(T);
     87 		}
     88 		freeTree(T);
     89 		cin >> N;      //接收下一组
     90 	}
     91 
     92 	return 0;
     93 }
    追求吾之所爱
  • 相关阅读:
    iOS 有用的代码片段
    iOS 限制软盘输入法
    UIlabel 遇到\n 换行iOS
    关于delegate 与 protocol 的理解 iOS
    ios 跳转到app store
    iOS 上下左右滑动手势
    求某段程序运行的高精度时间
    转载——GDB中应该知道的几个调试方法
    文章翻译——使用 GNU 的 GDB调试器,内存布局和栈——01
    第十章扩展——__cdecl 的压栈方式——printf
  • 原文地址:https://www.cnblogs.com/rstz/p/12376402.html
Copyright © 2011-2022 走看看