zoukankan      html  css  js  c++  java
  • MOOC 小白专场 判断是否同一棵二叉搜索树

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    using namespace std;
    // 判断是否同一棵二叉搜索树
    /*
    	求解思路:
    	1. 搜索树表示
    	2. 建搜索树T 
    	3. 判别一序列是否与搜索树一致
    */ 
    
    // 搜索树表示
    typedef struct TreeNode *Tree;
    struct TreeNode {
    	int v;
    	Tree Left, Right;
    	int flag;	// 判断该节点是否被访问过 
    }; 
    
    Tree NewNode(int V)
    {
    	Tree T = (Tree)malloc(sizeof(struct TreeNode));
    	T->v = V;
    	T->Left = T->Right = NULL;
    	T->flag = 0;
    	return T;
    }
    
    Tree Insert(Tree T, int V)
    {
    	if(!T)	T = NewNode(V);
    	else {
    		if(V > T->v)
    			T->Right = Insert(T->Right, V);
    		else
    			T->Left = Insert(T->Left, V);
    	}
    	return T;
    }
    
    Tree MakeTree(int N)
    {
    	Tree T;
    	int i, V;
    	
    	scanf("%d", &V);
    	T = NewNode(V);
    	for(i = 1; i < N; ++ i)
    	{
    		scanf("%d", &V);
    		T = Insert(T, V);
    	}
    	return T;
    }
    
    int check(Tree T, int V)
    {
    	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;
    	}
    }
    
    // 有bug版本 
    //int Judge(Tree T, int N)
    //{
    //	int i, V;
    //	
    //	if(V != T->v)	return 0;
    //	else	T->flag = 1;
    //	
    //	for(i = 1; i < N; ++ i)
    //	{
    //		scanf("%d", &V);
    //		if(!check(T, V))	return 0;
    //	}
    //	return 1;
    //}
    
    int Judge(Tree T, int N)
    {
    	int i, V, flag = 0;
    			/* flag: 0表示目前还一致, 1表示已经不一致 */
    	scanf("%d", &V);
    	if(V != T->v)	flag = 1;
    	else	T->flag = 1;
    	for(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)	/* 清除T中各节点的flag标记 */ 
    {
    	if(T->Left)	ResetT(T->Left);
    	if(T->Right)	ResetT(T->Right);
    	T->flag = 0;
    }
    
    void FreeTree(Tree T)	/* 释放T的空间 */ 
    {
    	if(T->Left)	FreeTree(T->Left);
    	if(T->Right)	FreeTree(T->Right);
    	free(T);
    }
    
    int main()
    {
    	int N, L, i;
    	Tree T;
    	
    	scanf("%d", &N);
    	while(N)
    	{
    		scanf("%d", &L);
    		T = MakeTree(N);
    		for(i = 0; i < L; ++ i)
    		{
    			if(Judge(T, N))	printf("Yes
    ");
    			else	printf("No
    ");
    			ResetT(T);	// 清除T中的标记flag 
    		}
    		FreeTree(T);
    		scanf("%d", &N);
    	}
    	
    	return 0;
    } 
    
    /*
    4 2
    3 1 4 2
    3 4 1 2
    3 2 4 1
    2 1
    2 1
    1 2
    0
    */
    

      

  • 相关阅读:
    SQL 查询两个时间段是否有交集的情况 三种写法
    c# 时间区间求并集
    uniapp 身份证识别 微信 百度 图片前端压缩 图片后端压缩
    Git命令大全
    构建android studio项目
    如何查tomcat进程和杀死进程
    mysql 备份 还原不了
    解决git extensions每次要输入用户名和密码
    JS string 转 Byte64[]
    Git cmd
  • 原文地址:https://www.cnblogs.com/mjn1/p/11530248.html
Copyright © 2011-2022 走看看