二叉树题目【洛谷】

P4715 【深基16.例1】淘汰赛

#include<iostream>
#include<cmath>
using namespace std;//由题目分析可知须获得前半段和后半段的优胜者再对比大小
int main(){
    int x,a[1000],minn=0,y,minm=0,z,n;
    cin>>x;
    n=pow(2,x);//n赋值为2的x次方
    for(int i=1;i<=n;i++){
        cin>>a[i];}
    for(int i=1;i<=n/2;i++){
        if(a[i]>minn){
            minn=a[i];
            y=i;}}//对前半部分进行查找寻找到最大值的位置
    for(int i=n/2+1;i<=n;i++){
        if(a[i]>minm){
            minm=a[i];
            z=i;}}//对后半部分进行查找寻找到最大值的位置
    if(minn>minm)cout<<z;
    if(minn<minm)cout<<y;//再对比两值的大小进行输出
    return 0;
}

P4913 【深基16.例3】二叉树深度

#include<iostream>
using namespace std;
struct sb{
    int z,y;}a[1000010];
int maxx=0;
void cf(int x,int s){
    if(x==0) return;//如果该节点为0,则返回
	maxx=max(maxx,s);//更新最大值
	cf(a[x].z,s+1);//搜索它的左边
	cf(a[x].y,s+1);}//搜索它的右边
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].z>>a[i].y;}
    cf(1,1);
    cout<<maxx;
    return 0;
}

P1827 [USACO3.4] 美国血统 American Heritage

#include<iostream>
#include<cstring>
using namespace std;
void dfs(string s1,string s2){
    char root=s2[0];//根为s2的第一个元素
    int l=s1.find(root),r=s1.size()-l-1;//记录左右子树的长度
    if(l!=0){
        string s3=s1.substr(0,l),s4=s2.substr(1,l);//抽出左子树
        dfs(s3,s4);}//递归的调用它
        string s3=s1.substr(l+1,r),s4=s2.substr(l+1,r);//抽出右子树
        dfs(s3,s4);}//递归的调用它
    cout<<root;
    }//得到树的后序遍历
int main(){
    string s1,s2;
    cin>>s1>>s2;
    dfs(s1,s2);
    return 0;

}

P5076 【深基16.例7】普通二叉树(简化版)

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,op,x,a[10010],z=1;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>op>>x;
        if(op==1)cout<<lower_bound(a+1,a+z,x)-a<<endl;//查询一个数的排名
        if(op==2)cout<<a[x]<<endl;
        if(op==3){
            int y=lower_bound(a+1,a+z,x)-a;
            if(y==1)cout<<"−"<<2147483647<<endl;
            else cout<<a[y-1]<<endl;//判断是否有前驱
            }
        if(op==4){
            int y=upper_bound(a+1,a+z,x)-a;
            if(y==z)cout<<2147483647<<endl;
            else cout<<a[y]<<endl;//判断是否有后继
            }
        if(op==5){
            a[z]=x;
            z++;
            sort(a+1,a+z);
            }
        }//进行插入操作
    return 0;
    }

P1364 医院设置

#include<bits/stdc++.h>
using namespace std;
struct node{
    int left,right,father,value; 
}t[110];//用结构体存节点
int n,sum,ans=INT_MAX,vis[110];
void dfs(int step,int pos){
	sum+=step*t[pos].value;
	int fa=t[pos].father,l=t[pos].left,r=t[pos].right;
	if(fa!=0&&vis[fa]==0){
		vis[fa]=1;
		dfs(step+1,fa);
	}//去父节点的条件
	if(l!=0&&vis[l]==0){
		vis[l]=1;
		dfs(step+1,l);
	}//去左节点的条件
	if(r!=0&&vis[r]==0){
		vis[r]=1;
		dfs(step+1,r);
	}//去右节点的条件
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>t[i].value>>t[i].left>>t[i].right;
		t[t[i].left].father=i;
		t[t[i].right].father=i;	
	}//建立二叉树模型
	for(int i=1;i<=n;i++){
		sum=0;
		memset(vis,0,sizeof(vis));//定义为零
		vis[i]=1;//是否遍历过
		dfs(0,i);
		ans=min(ans,sum);
	}
	cout<<ans;
	return 0;
}

P1229 遍历问题

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    string s1,s2;
    cin>>s1>>s2;
    long long ans=1;
    for(int i=0;i<=s1.length()-2;i++){
        for(int j=0;j<=s2.length()-1;j++){
            if(s1[i]==s2[j]){//从先根遍历和后根遍历中找到相等的
                if(s1[i+1]==s2[j-1]) ans*=2;//如果相等,则中根遍历情况乘2
                    break;}}}
    cout<<ans;
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值