根据层次遍历重建完全二叉树

本文介绍了一种使用C++实现完全二叉树的方法,通过数组初始化树的节点,并利用递归函数进行中序遍历。文章详细展示了如何从数组构建二叉树结构,以及如何遍历树以打印节点值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值