• PTA天梯赛 玩转二叉树|中序前序建树 层序遍历 镜像反转


    思路

    1.中序遍历和前序遍历
    2.镜像反转,就是交换左右子节点
    3.bfs层序遍历

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e3;
    int in[maxn],pre[maxn];
    int n;
    struct node{
    	int v;
    	node *l,*r;
    };
    vector<int> ans;
    
    //1.中序遍历和前序遍历
    node *build(int index,int inl,int inr){
    	if(inr < inl) return NULL;
    	int pos = inl;
    	while(in[pos] != pre[index]) pos++;
    	node *root = new node();
    	root->l = NULL,root->r = NULL,root->v = pre[index];
    	root->l = build(index+1,inl,pos-1);
    	root->r = build(index+pos-inl+1,pos+1,inr);
    	return root;
    }
    
    //2.镜像反转,就是交换左右子节点
    void dfs(node *root){
    	if(root->l != NULL && root->r != NULL){
    		swap(root->l,root->r);
    	}
    	if(root->l != NULL) dfs(root->l);
    	if(root->r != NULL) dfs(root->r);
    }
    
    //3.bfs层序遍历
    void bfs(node *root){
    	queue<node> q;
    	q.push(*root);
    	while(!q.empty()){
    		node u = q.front();
    		q.pop();
    		ans.push_back(u.v);
    		if(u.l != NULL) q.push(*u.l);
    		if(u.r != NULL) q.push(*u.r);
    	}
    }
    
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>in[i];
    	for(int i=1;i<=n;i++) cin>>pre[i];
    	node* Root= new node();
    	Root->l = NULL,Root->r = NULL,Root->v = in[1];
    	Root = build(1,1,n);
    	dfs(Root);
    	bfs(Root);
    	for(int i=0;i<ans.size()-1;i++){
    		cout<<ans[i]<<" ";
    	}
    	cout<<ans[ans.size()-1];
    	return 0;
    }
    
  • 相关阅读:
    MVC(一)
    C# 泛型(二)
    C# 泛型(一)
    ASP.NET MVC Razor
    ASP.NET 服务端接收Multipart/form-data文件
    centos(网易163)软件源更换
    xshell中文乱码问题
    centos7修改主机名
    sqlalchemy python中的mysql数据库神器
    mysql 更新与查询(排序 分组 链接查询)
  • 原文地址:https://www.cnblogs.com/fisherss/p/12623608.html
Copyright © 2020-2023  润新知