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

    我的代码:C++(g++ 6.5.0)

    #include <iostream>
    
    typedef struct treeNode * tree;
    struct treeNode {
    	int v;
    	tree left, right;
    	int flag;
    };
    tree newNode(int V) {
    	tree retTree = (tree)malloc(sizeof(struct treeNode));
    	retTree->v = V;
    	retTree->flag = 0;
    	retTree->left = retTree->right = NULL;
    	return retTree;
    }
    tree insert(tree T,int V) {	
    	if (!T) {
    		T = newNode(V); 
    	}else{
    		if (V < T->v) {
    			T->left = insert(T->left, V);
    		}
    		else {
    			T->right = insert(T->right, V);
    		}
    	}
    	return T;
    }
    tree makeTree(int N) {
    	int V;
    	scanf("%d",&V);
    	tree T = newNode(V);
    	for (int i = 1; i <= N-1;i++) {
    		scanf("%d",&V);
    		T = insert(T, V);
    	}
    	return T;
    }
    int check(tree T,int V) {
    	/* 0不一致 1一致 */
    	if (!T) return 0;
    	if (T->flag) {
    		if (V < T->v) return check(T->left, V);
    		else if (V > T->v) return check(T->right, V);
    		else return 0;
    	}else {
    		if (V == T->v) {
    			T->flag = 1;
    			return 1;
    		}
    		else return 0;
    	}
    }
    int judge(tree T,int N) {
    	/* 0目前还一致 1不一致 */
    	int V;
    	int flag = 0;
    	scanf("%d", &V);
    	if (T->v != V) flag = 1;
    	else T->flag = 1;
    	for (int i = 1; i < N;i++) {
    		scanf("%d", &V);
    		if ((!flag)&&!(check(T, V))) flag = 1;
    	}
    	if (flag) return 0;
    	else return 1;
    }
    void resetT(tree T) {
    	if (T->left) resetT(T->left);
    	if (T->right) resetT(T->right);
    	T->flag = 0;
    }
    void freeTree(tree T) {
    	if (T->left) freeTree(T->left);
    	if (T->right) freeTree(T->right);
    	free(T);
    }
    
    int main()
    {
    	int N, L;
    	tree T;
    	scanf("%d",&N);
    	while (N) {
    		scanf("%d", &L);
    		T = makeTree(N);
    		for (int i = 0; i < L; i++) {
    			if (judge(T, N)) printf("Yes
    ");
    			else printf("No
    ");
    			resetT(T);
    		}
    		freeTree(T);
    		scanf("%d", &N);
    	}
    }
    
  • 相关阅读:
    jquery新知识
    jquery回顾
    Filter和Listener
    jsp,jstl,el
    cookie和session
    servlet和HTTP原理
    xml基本知识
    linux 相关操作
    linux mysql 相关操作、问题
    linux 文件结构
  • 原文地址:https://www.cnblogs.com/TangYJHappen/p/13624286.html
Copyright © 2011-2022 走看看