最大二叉树

给定一个不含重复元素的整数数组 nums。以此数组直接递归构建的最大二叉树。最大二叉树定义如下:

  • 二叉树的根是数组 nums 中的最大元素。
  • 左子树是通过数组中最大值左边部分递归构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分递归构造出的最大二叉树。

返回有给定数组 nums 构建的最大二叉树 。

看完题目意识到数据结构里面二叉树二叉树遍历的知识忘记了

递归构建最大二叉树
eg: 3 2 1 6 0 5
最大值为6,以6为根
3 2 1 6 05
3 2 1
最大值为3,以3为根
3 2 1
以此类推

二叉树先序遍历
又叫先根遍历
跟左右
中序遍历
左根右
后序遍历
左右根

标准输入
3 2 1 6 0 5
标准输出
6 3 null 2 null 1 5 0 null

标准输入
3 2 1
标准输出
3 null 2 null 1

代码

#include<bits/stdc++.h>
using namespace std;
int a[1001];
int findmax(int k,int j);
void fore(int p,int k,int j);
int i=0;//个数 
int main()
{
	int n;
//	while(scanf("%d",&n)!=EOF){
//		a[i]=n;
//		i++;		
//	}
	while(cin>>n){
		a[i]=n;
		i++;
	} 
	int h_p = findmax(0,i-1);
	fore(h_p,0,i-1);
	return 0;
 } 
//查找k,j的a数组 
int findmax(int k,int j){
	//if() 
	int max=a[k];
	int point=k;
	//找最大的 
 	for(int n=k;n<=j;n++){
 		if(a[n]>=max){
 			point = n;
 			max=a[n];
		 }
	}
	return point;
} 
//前序遍历
void fore(int p,int k,int j){
	if(p>=0&&p<i){
		cout<<a[p]<<" ";
		if(k>=0&&k<=p-1){
			//查左子 
			int pl=findmax(k,p-1);
			fore(pl,k,p-1);
			//p的左子不空,右子空,查完左子输出 
			if(p+1>j){
				cout<<"null"<<" "; 
			} 
		}
		if(j<=i&&j>=p+1){
			//p的右子不空,左子空,先输出再查右子 
			if(p-1<k){
				cout<<"null"<<" "; 
			} 
			//查右子
			int pr=findmax(p+1,j);
			fore(pr,p+1,j); 
		}
		//若p的左右子皆为空,不输出null,其他输出 
	}	
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值