数据结构之二叉树----给出先序和中序,求后序

本文详细阐述了如何通过先序和中序序列构建二叉树的过程,包括关键步骤和算法实现。

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

// 假设一颗二叉树的先序序列是:EBADCFHGIKJ。 中序序列为:ABCDEFGHIJK
//
 Test.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <stdio.h>
#include <iostream>

using namespace std;
struct BinaryNode
{
	char str;
	BinaryNode * leftNode;
	BinaryNode * rightNode;
};

// 先序的起始字符,为分割中序字符串的字符,随后把序列一份为二,然后各自解决
void ReCheckChild(char * priorStr,int priorLow, int priorHigh, char * midStr, int midLow, int midHigh, BinaryNode *node)
{
	//1.  结束条件的判定
	if(priorLow > priorHigh || midLow > midHigh)
	{
		delete node;
		node = NULL;
		return;
	}
	//2. a. 先序遍历的第一个点,即为此二叉树节点的值。 b. 随后代码此值用于分割中序
	node->str = priorStr[priorLow];
	
	// 3. 没有可分割的,就返回,但保存此节点的值
	if(priorLow == priorHigh || midLow == midHigh)
		return;

	// 4. 获取此节(也是先序的第一个字符)的值,在中序中的位置信息:当获取了位置信息就可以把先序和中序的字符分割
	int index = -1;
	for(int i= midLow; i<=midHigh; i++)
	{
		if( priorStr[priorLow] == midStr[i])
		{
			index = i-midLow;
			break;
		}
	}
	if(index == -1)
		return;

	node->leftNode = new BinaryNode();
	node->rightNode = new BinaryNode();
	// 5. 分别以左右孩子节点开算
 	ReCheckChild(priorStr,priorLow+1, priorLow+index, midStr, midLow, midLow+index, node->leftNode);
	ReCheckChild(priorStr, priorLow+index+1, priorHigh, midStr, midLow + index +1, midHigh, node->rightNode);
}
int _tmain(int argc, _TCHAR* argv[])
{
	BinaryNode * node = new BinaryNode();
	char* priorStr = "ebadcfhgikj";
	char* midStr = "abcdefghijk";
	// 获取了孩子节点,后序序列也不难求出
	ReCheckChild(priorStr, 0, strlen(priorStr)-1, midStr,  0, strlen(priorStr)-1, node);
	return 0;
}
如何由二叉树的先序和中序序列画出二叉树 - wz625 - wanna
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值