zoukankan      html  css  js  c++  java
  • A1043 Is It a Binary Search Tree (25分)

    一、技术总结

    1. 这一题是二叉排序树的问题,题目主要是给出二叉排序树的先序遍历或者二叉排序树镜像的先序遍历或其他,如果是前两种输出YES,并且输出各自的后序遍历。后者直接输出NO
    2. 关键在于创建树,据我观察发现无论是镜像的先序遍历还是原来二叉排序树的先序遍历,可以直接根据二叉排序树的特点进行树的创建。用inset函数,创建出来都是二叉排序树,没有镜像与不镜像之分。到了这一步,只需处理如何将这个标准的二叉排序树,变成镜像的先序遍历,其实只要将左右子树递归的顺序换一下即可。详细参考代码。
    3. 然后就是将其进行比较匹配,输出。

    二、参考代码

    #include<bits/stdc++.h>
    using namespace std;
    struct node{
    	int data;
    	node *lchild, *rchild;
    };
    void insert(node* &root, int data){
    	if(root == NULL){
    		root = new node;
    		root->data = data;
    		root->lchild = root->rchild = NULL;//这句不能够漏掉 
    		return;
    	}
    	if(data < root->data) insert(root->lchild, data);
    	else insert(root->rchild, data);
    }
    //先序遍历结果存于vi 
    void preOrder(node* root, vector<int> &vi){
    	if(root == NULL) return;
    	vi.push_back(root->data);
    	preOrder(root->lchild, vi);
    	preOrder(root->rchild, vi); 
    }
    //镜像树的先序遍历,结果存放于vi
    void preOrderMirror(node* root, vector<int> &vi){
    	if(root == NULL) return;
    	vi.push_back(root->data);
    	preOrderMirror(root->rchild, vi);
    	preOrderMirror(root->lchild, vi);
    } 
    //后序遍历结果存于vi 
    void postOrder(node* root, vector<int> &vi){
    	if(root == NULL) return;
    	postOrder(root->lchild, vi);
    	postOrder(root->rchild, vi);
    	vi.push_back(root->data);
    }
    //镜像树的后序遍历,结果存放于vi
    void postOrderMirror(node* root, vector<int> &vi){
    	if(root == NULL) return;
    	postOrderMirror(root->rchild, vi);
    	postOrderMirror(root->lchild, vi);
    	vi.push_back(root->data);
    } 
    vector<int> origin, pre, preM, post, postM;
    int main(){
    	int n, data;
    	node* root = NULL;
    	scanf("%d", &n);
    	for(int i = 0; i < n; i++){
    		scanf("%d", &data);
    		origin.push_back(data);
    		insert(root, data);
    	}
    	preOrder(root, pre);
    	preOrderMirror(root, preM);
    	postOrder(root, post);
    	postOrderMirror(root, postM);
    	if(origin == pre){
    		printf("YES
    ");
    		for(int i = 0; i < n; i++){
    			if(i != 0) printf(" ");
    			printf("%d", post[i]);
    		}
    	}else if(origin == preM){
    		printf("YES
    ");
    		for(int i = 0; i < n; i++){
    			if(i != 0) printf(" ");
    			printf("%d", postM[i]);
    		}		
    	}else{
    		printf("NO
    "); 
    	}
    	return 0;
    } 
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    算法练习:求字符串的最长重复子串(Java实现)
    Oracle数据库中遇到的坑
    解决Oracle死锁问题步骤
    转:Spring Cache抽象详解
    Spring MVC测试框架详解——服务端测试
    转:SpringMVC中日期格式的转换
    freemarker判断是否为空
    jQuery Pagination分页插件
    Java链式方法
    mysql强制索引和禁止某个索引
  • 原文地址:https://www.cnblogs.com/tsruixi/p/12333745.html
Copyright © 2011-2022 走看看