由二叉树的先序序列和中序序列构建二叉树

构造思想:
假设当前处理先序序列pre的处理区间是[a,b],中序序列in处理的区间是[c,d]
例如:

	string pre = "123456789";
	string in = "325416879";

pre的处理区间是[0,8],中序序列in处理的区间是[0,8]
a<b,则以pre[a]建立二叉树的根结点,然后搜索in[c,d],找到in[i] == pre[a]的位置i,从而把中序序列分为两个中序子序列in[c,i-1]in[i+1,d],前者有i-1-c+1 = i - c个元素,后者有d-(i+1) +1个元素。再分别以pre[a+1,a+i-c]in[c,i-1]递归构造根的左子树(pre[a]为根,不用 再处理),以pre[a+i-c+1,b]in[i+1,d]递归构造根的右子树。
注:为什么以pre[a+1,a+i-c]in[c,i-1]递归构造根的左子树,,以pre[a+i-c+1,b]in[i+1,d]递归构造根的右子树?
因为先序遍历和中序遍历的共同点是后访问右子树,所以i前面的在pre里除了pre[a]都是左子树,有i-c个元素。

代码:

#include<iostream>
#include<string>
#include<vector>
#include<queue> 

using namespace std;

struct TreeNode
{
	char data;
	TreeNode *lchild,*rchild;
};

void createBinTree_pre_in(TreeNode *&root,string pre,string in,int a,int b,int c,int d)
{//由二叉树的先序序列和中序序列构建二叉树
	if(a <= b)
	{
		root = new TreeNode();		//创建根节点 
		root->data = pre[a];
		root->lchild = NULL;
		root->rchild = NULL;
		int i;
		for(i = c; i <= d; i++)		//中序序列中查找根的位置,此处为i 
		{
			if(in[i] == pre[a])
				break;
		}
		createBinTree_pre_in(root->lchild,pre,in,a+1,a+i-c,c,i-1);	//递归建左子树 
		createBinTree_pre_in(root->rchild,pre,in,a+i-c+1,b,i+1,d);	//递归建右子树 
	}
}

void levelOrder(TreeNode* root)		//利用队列实现二叉树的层次遍历 
{
	queue<TreeNode*>que;
	TreeNode* p = root;
	que.push(p);
	while(!que.empty())
	{
		p = que.front();   que.pop();
		cout<<p->data;
		if(p->lchild != NULL)
		{
			que.push(p->lchild);
		}
		if(p->rchild != NULL)
		{
			que.push(p->rchild);
		}
	} 
}
int main()				//test
{
	TreeNode *root;
	string pre = "123456789";
	string in = "325416879";
	createBinTree_pre_in(root,pre,in,0,8,0,8);
	levelOrder(root);
	return 0;
}

参考:
《数据结构C语言描述第2版》—殷人昆

  • 4
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 构建叉树的步骤如下: 1. 从序列取出第一个节点作为根节点。 2. 在序列找到根节点的位置,将序列分成左子树和右子树两部分。 3. 根据左子树的长度,在序列找到左子树的节点,将序列分成左子树和右子树两部分。 4. 递归地构建左子树和右子树。 具体实现可以参考以下代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def buildTree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root = TreeNode(root_val) root_index = inorder.index(root_val) left_inorder = inorder[:root_index] right_inorder = inorder[root_index+1:] left_preorder = preorder[1:1+len(left_inorder)] right_preorder = preorder[1+len(left_inorder):] root.left = buildTree(left_preorder, left_inorder) root.right = buildTree(right_preorder, right_inorder) return root ``` 其,preorder和inorder分别为序列序列。函数返回构建好的二叉树的根节点。 ### 回答2: 二叉树是一种重要的数据结构,它由节点和边组成,每个节点最多拥有两个子节点。根据节点的位置可以将二叉树分为左子树、右子树和根节点。二叉树序列序列和后序列指的是二叉树节点遍历的顺。 通过二叉树序列序列可以构建叉树。具体操作流程如下: 1. 确定根节点:二叉树序列第一个节点就是根节点,通过在序列查找根节点,可以将序列分为左子树和右子树两个部分。 2. 确定左右子树的序列序列:通过根节点在序列的位置确定左右子树的序列,再根据左右子树节点的个数,在序列确定左右子树的序列。 3. 递归构建叉树:对于左子树和右子树,重复以上操作,直到构建出完整的二叉树。 下面用一个例子来说明以上操作的具体过程。 假设二叉树序列为{1, 2, 4, 5, 3, 6, 7},序列为{4, 2, 5, 1, 6, 3, 7}。 1. 确定根节点:序列的第一个节点是1,因此1是二叉树的根节点。在序列查找1,可以将序列分为左子树{4, 2, 5}和右子树{6, 3, 7}。 2. 确定左右子树的序列序列:左子树的序列是{4, 2, 5},左子树节点的个数为3,因此左子树的序列是{2, 4, 5}。右子树的序列是{6, 3, 7},右子树节点的个数为3,因此右子树的序列是{3, 6, 7}。 3. 递归构建叉树:对于左子树和右子树,重复以上操作,构建出完整的二叉树。 对于左子树{2, 4, 5},序列为{2, 4, 5},序列为{4, 2, 5}。 1. 确定根节点:左子树的序列第一个节点是2,因此2是左子树的根节点。在序列查找2,可以将序列分为左子树{4}和右子树{5}。 2. 确定左右子树的序列序列:左子树的序列是{4},左子树节点的个数为1,因此左子树的序列是{4}。右子树的序列是{5},右子树节点的个数为1,因此右子树的序列是{5}。 3. 递归构建叉树:对于左子树和右子树,重复以上操作,构建出完整的二叉树。 对于右子树{3, 6, 7},序列为{3, 6, 7},序列为{6, 3, 7}。 1. 确定根节点:右子树的序列第一个节点是3,因此3是右子树的根节点。在序列查找3,可以将序列分为左子树{6}和右子树{7}。 2. 确定左右子树的序列序列:左子树的序列是{6},左子树节点的个数为1,因此左子树的序列是{6}。右子树的序列是{7},右子树节点的个数为1,因此右子树的序列是{7}。 3. 递归构建叉树:对于左子树和右子树,重复以上操作,构建出完整的二叉树。 最终,通过二叉树序列序列,我们成功构建出了如下的二叉树:             1           /    \          2     3        /  \    /  \        4   5  6   7 总之,通过序列序列,我们可以确定二叉树的根节点和左右子树的序列序列,进而通过递归的方式构建出完整的二叉树。 ### 回答3: 二叉树序列是指按照根节点、左子节点、右子节点的顺排列二叉树的各个节点,而序列是指按照左子节点、根节点、右子节点的顺排列二叉树的各个节点。通过这两个序列我们可以重构二叉树构建叉树的过程主要分为以下三个步骤: 1. 确定根节点:序列的第一个节点就是二叉树的根节点。在序列找到根节点,其左边是左子树的序列,右边是右子树的序列。 2. 确定左右子树:根据找到的左子树序列序列,可以递归地构建出左子树。同样的,也可以递归地构建出右子树。 3. 重构二叉树:通过递归过程构建的左子树和右子树,以及根节点可以构建完整的二叉树。 举个例子,如果给出的二叉树序列为{1,2,4,7,3,5,6,8},序列为{4,7,2,1,5,3,8,6},那么我们首可以确定这棵二叉树的根节点就是1。在序列我们找到1这个节点,根据该节点左边的序列{4,7,2}和序列{2,4,7}可以递归地构建出左子树。同样的,根据1节点右边的序列{5,3,8,6}和序列{3,5,6,8}可以递归地构建出右子树。最后将根节点、左子树和右子树连接起来,得到完整的二叉树。 通过以上的步骤,我们可以通过二叉树序列序列构建出一棵二叉树。这个过程的时间复杂度为O(n),其n为二叉树节点的个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值