给定一个不含重复元素的整数数组 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,其他输出
}
}