中序遍历和层次遍历构造二叉树

该博客介绍了一种利用层次遍历(LevelOrder)和中序遍历(InOrder)序列来构建二叉树的方法。通过遍历序列,确定每个节点在中序序列的位置,从而构建出对应的二叉树结构。代码使用C++编写,并提供了前序遍历、中序遍历和后序遍历的验证功能。
摘要由CSDN通过智能技术生成

/*
    题目:层次遍历和中序遍历构建二叉树
    算法思想:InOrder, LevelOrder 分别存储中序序列和层变遍历序列,用cnt1记录层次遍历序列插入结点的下标,[low, high]为插入结点在中序序列的范围,插入LevelOrder[cnt1]
    找到LevelOrder[cnt1](层次遍历序列结点)在[low, high](中序序列)具体位置 mid
    若 mid > low 则根据[low, mid - 1]和LevelOrder[cnt1 + 1] 继续插入
    若 mid < high 则根据 [mid + 1, high] 和 LevelOrder[cnt1 + 2](存在左兄弟,左兄弟占用LevelOrder[cnt1 + 1); 
    或LevelOrder[cnt1 + 1](不存在左兄弟)继续插入 
*/ 
#include <cstdio>
#include <queue>
using namespace std;

typedef struct BNode        //二叉树结点 
{
    int data;
    struct BNode *lchild, *rchild;
}BNode;

typedef struct infor        //插入时需要的信息  infor(information)
{
    int low, high;            //插入结点在中序队列中的位置范围 
    int flag;                //1 插入双亲结点的右结点, 0 左结点 
    BNode *parent;     

要由层次遍历中序遍历序列构造二叉树,可以按照以下步骤进行: 1. 首先,根据层次遍历序列构建二叉树的根节点。 2. 然后,根据中序遍历序列找到根节点在其中的位置,将中序遍历序列分为左子树和右子树的序列。 3. 将左子树的层次遍历序列提取出来,并以左子树的层次遍历序列和左子树的中序遍历序列递归地构建左子树。 4. 将右子树的层次遍历序列提取出来,并以右子树的层次遍历序列和右子树的中序遍历序列递归地构建右子树。 5. 最后,将左子树和右子树连接到根节点上,形成完整的二叉树。 以下是一个示例代码,演示了如何实现这个过程: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(level_order, in_order): if not level_order or not in_order: return None root_val = level_order[0] root = TreeNode(root_val) root_index = in_order.index(root_val) left_in_order = in_order[:root_index] right_in_order = in_order[root_index+1:] left_level_order = [val for val in level_order if val in left_in_order] right_level_order = [val for val in level_order if val in right_in_order] root.left = buildTree(left_level_order, left_in_order) root.right = buildTree(right_level_order, right_in_order) return root ``` 你可以使用该函数来构造二叉树,传入层次遍历序列中序遍历序列作为参数。注意,这里假设输入的层次遍历序列中序遍历序列是有效的,且没有重复元素。如有需要,你可以根据实际情况对代码进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值