您的位置:首页 > 其它

南阳 重建二叉树

2015-11-27 17:10 141 查看


重建二叉树

时间限制:1000 ms  |  内存限制:65535 KB
难度:3

描述题目很简单,给你一棵二叉树的后序和中序序列,求出它的前序序列(So easy!)。

输入输入有多组数据(少于100组),以文件结尾结束。

每组数据仅一行,包括两个字符串,中间用空格隔开,分别表示二叉树的后序和中序序列(字符串长度小于26,输入数据保证合法)。
输出每组输出数据单独占一行,输出对应得先序序列。
样例输入
ACBFGED ABCDEFG
CDAB CBAD


样例输出
DBACEGF
BCAD


详解:http://blog.csdn.net/jakiechen68/article/details/8974167


对于一颗二叉树,可以根据先序遍历(后序遍历)和中序遍历重新还原出二叉树。根据先序遍历和中序遍历还原二叉树的主要思想:1、先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点。2、根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中。由此可以知道先序遍历中左子树以及右子树的起止位置。3、分别对左子树和右子树重复上述的过程,直至所有的子树的起止位置相等时,说明已经到达叶子节点,遍历完毕。

#ifndef __FUNCTION_H__
#define __FUNCTION_H__
#include <iostream>

using namespace std;
struct BinaryTreeNode
{
int nodeValue;
BinaryTreeNode *pLeft;
BinaryTreeNode *pRight;
};

BinaryTreeNode * BuildRecursivly(int *pPrevOrderStart, int *pPrevOrderEnd, int *pInOrderStart, int *pInOrderEnd)
{
//在先序遍历序列中取出第一个元素即为根节点元素
int value = pPrevOrderStart[0];
//构造根节点
BinaryTreeNode *root = new BinaryTreeNode;
root->nodeValue = value;
root->pLeft = root->pRight = NULL;
//递归结束的情况,即只剩一个叶子节点
if(pPrevOrderStart == pPrevOrderEnd)
{
if(pInOrderStart == pInOrderEnd && *pPrevOrderStart == *pInOrderStart)
return root;
else
throw std::exception();
}
//在中序遍历序列中找出根节点的位置
int *pInOrderCursor = pInOrderStart;
while(pInOrderCursor < pInOrderEnd && *pInOrderCursor != value)
{
pInOrderCursor++;
}
if(pInOrderCursor == pInOrderEnd && *pInOrderCursor != value)
{
throw std::exception();
}
//取得左子树的长度以及在先序遍历中取得左子树的起始位置
int leftTreeLen = pInOrderCursor - pInOrderStart;
int *pPrevOrderLeftTreeEnd = pPrevOrderStart + leftTreeLen;
//如果左子树存在,则递归左子树
if(leftTreeLen > 0)
{
root->pLeft = BuildRecursivly(pPrevOrderStart+1, pPrevOrderLeftTreeEnd,
pInOrderStart, pInOrderCursor-1);
}
//如果右子树存在,则递归右子树
if((pPrevOrderEnd-pPrevOrderStart) > leftTreeLen)
{
root->pRight = BuildRecursivly(pPrevOrderLeftTreeEnd+1, pPrevOrderEnd,
pInOrderCursor+1, pInOrderEnd);
}

return root;
}

BinaryTreeNode * BulidBinaryTree(int *szPrevOrder, int *szInOrder, int nodeNum)
{
if(szPrevOrder == NULL || szInOrder == NULL)
return NULL;
return BuildRecursivly(szPrevOrder, szPrevOrder+nodeNum-1,
szInOrder, szInOrder+nodeNum-1);
}

/*先序遍历*/
void PrevOrder(BinaryTreeNode *root)
{
if(root == NULL)
return;
//根
cout<<root->nodeValue<<' ';
//左子树
if(root->pLeft != NULL)
PrevOrder(root->pLeft);
//右子树
if(root->pRight != NULL)
PrevOrder(root->pRight);
}

/*中序遍历*/
void InOrder(BinaryTreeNode *root)
{
if(root == NULL)
return;
//左子树
if(root->pLeft != NULL)
InOrder(root->pLeft);
//根
cout<<root->nodeValue<<' ';
//右子树
if(root->pRight != NULL)
InOrder(root->pRight);
}

/*后序遍历*/
void PostOrder(BinaryTreeNode *root)
{
if(root == NULL)
return;
//左子树
if(root->pLeft != NULL)
PostOrder(root->pLeft);
//右子树
if(root->pRight != NULL)
PostOrder(root->pRight);
//根
cout<<root->nodeValue<<' ';
}

#endif
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: