重建二叉树
2016-03-22 21:43
218 查看
题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列,如果如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。
算法:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并输出它的后序遍历序列,如果如果题目中所给的前序和中序遍历序列不能构成一棵二叉树,则输出”No”。
算法:
#include<iostream> using namespace std; int tags = 0; typedef struct BinaryTreeNode{ //二叉树的结构体 int data; struct BinaryTreeNode *left; struct BinaryTreeNode *right; }BinaryTreeNode; BinaryTreeNode* construct(int *startPreorder, int *endPreorder, int *startInorder, int *endInorder){ //核心算法 int rootValue = startPreorder[0]; BinaryTreeNode *root = new BinaryTreeNode(); root->data = rootValue; root->left = NULL; root->right = NULL; if(startPreorder == endPreorder){ //如果树的前序和中序只有一个节点,且相等则返回根节点,并致标志位为1 if(startInorder == endInorder && *startPreorder == *startInorder){ tags = 1; return root; } else{ //否则将标志位置0 //throw exception("Invalid input."); tags = 0; return NULL; } } int *rootInorder = startInorder; while(rootInorder <= endInorder && *rootInorder != rootValue){ //在中序序列中找到根节点的位置 ++rootInorder; } if(rootInorder == endInorder && *rootInorder != rootValue){ // throw exception("Invalid input."); tags = 0; return NULL; } int leftLength = rootInorder - startInorder; int *leftPreorderEnd = startPreorder + leftLength; // 递归进行左右紫子树的构造 if(leftLength > 0){ root->left = construct(startPreorder + 1, leftPreorderEnd, startInorder, rootInorder - 1); } if(leftLength < endPreorder - startPreorder){ root->right = construct(leftPreorderEnd + 1, endPreorder, rootInorder + 1, endInorder); } return root; } BinaryTreeNode* constructCore(int *preorder, int *inorder, int length){ if(preorder == NULL || inorder == NULL || length <= 0){ //检查是否构成树 return NULL; } return construct(preorder, preorder + length - 1, inorder, inorder + length - 1); } void post_order(BinaryTreeNode *r) //后序遍历输出节点 { BinaryTreeNode *pNode = r; if(pNode != NULL) { post_order(pNode->left); post_order(pNode->right); cout<<pNode->data<<' '; } } int main(){ int n; int pre[1010], in[1010]; while(cin>>n){ //输入格式定义,先输入节点数,再输入先序和中序序列 for(int i = 0; i < n; i++){ cin>>pre[i]; } for(int j = 0; j < n; j++){ cin>>in[j]; } BinaryTreeNode *Root = constructCore(pre, in, n); if(tags){ post_order(Root); } else{ cout<<"No"<<endl; } } return 0; }
相关文章推荐
- Test for Job(poj3249)
- 安装了Visual Studio 2008自带的SQL Server 2005后,设置sa登录名
- 【mysql】数据库定时备份、数据恢复
- Google 网上论坛(Google Online Forums)
- json-c有时我们会忽略的问题
- linux-kernel-4.1 USB-批量传输 赏析
- opencv笔记 RotatedRect类
- AngularJS HTML DOM
- StringBuffer与StringBuilder详解
- haskell 安装gtk 适合win7GUI编程
- iOS利用drawRect画图
- PHP中字符串比较的常用方法
- StringBuffer与StringBuilder详解
- 选择器
- 软件工程导论 习题一
- android不透明度对应的值
- Floyd判圈算法
- NEC笔试汇总
- nyoj 119 士兵杀敌(三)
- [XML]学习笔记(一)XML简介