#include<iostream>
#include<vector>
#include<math.h>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {};
};
void insert(TreeNode* node,vector<int> arr,int i)
{
int len=(int)arr.size();
if(i>=len) //访问到数组末尾时跳出
return;
node->val=arr[i]; //赋值给该节点
if(2*(i+1)-1 <= len-1) //如果该节点的左子节点可以赋值,即数组长度足够给左子节点赋值
{
TreeNode* l=new TreeNode(NULL); //创建左子节点
node->left=l; //将该节点指向新创建的左子节点
insert(l,arr,2*(i+1)-1); //递归赋值
}
if(2*(i+1) <= len-1) //如果该节点的右子节点可以赋值,即数组长度足够给右子节点赋值
{
TreeNode* r=new TreeNode(NULL); //创建右子节点
node->right=r; //将该节点指向新创建的右子节点
insert(r,arr,2*(i+1)); //递归赋值
}
}
//创建树的根节点,调用insert()为根节点添加子节点
TreeNode* ConTree(vector<int> arr)
{
TreeNode* node=new TreeNode(NULL);
insert(node,arr,0);
return node;
}
void inOrder(TreeNode* node)
{
if(node==NULL) //若节点为空,跳出
return;
inOrder(node->left); //查看是否有左子节点,若有,递归查看
cout<<node->val<<" "; //无左子节点,打印该节点
inOrder(node->right); //查看是否有右子节点,若有,递归查看
}
int main()
{
vector<int> arr;
int n,index,a;
cin>>n; //输入该完全二叉树的层数
index=pow(2,n)-1; //完全二叉树的节点数等于层次数的n次方-1
while(index--)
{
cin>>a;
arr.push_back(a);
}
TreeNode* root=ConTree(arr);
inOrder(root);
cout<<endl;
return 0;
}
根据层次遍历重建完全二叉树
最新推荐文章于 2024-10-31 01:07:31 发布