// 假设一颗二叉树的先序序列是: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;
}