5-23 还原二叉树 (25分)
2015-12-02 22:13
316 查看
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出为一个整数,即该二叉树的高度。
[/code]
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9 ABDFGHIEC FDHGIBEAC
输出样例:
5
这道题要求出的是二叉树的高度,只需要把二叉树还原,再根据二叉树算法,求出二叉树高度即可。
根据前序遍历和中序遍历或者中序遍历和后序遍历都可将二叉树还原,中序遍历是必不可缺少的。中序遍历的特殊性就在其能将左子树和右子树分开,而根据前序遍历和后序遍历又能确定根节点。利用递归算法就能很好的将二叉树还原。
#include<iostream> using namespace std; struct TreeNode { TreeNode* left; TreeNode* right; char elem; }; TreeNode*findTree(char*in,char*pre,int length) { if(length==0) return NULL; TreeNode* node=new TreeNode; node->elem=*pre; int i=0; for(;i<length;i++) { if(in[i]==*pre) break; } node->left=findTree(in,pre+1,i); node->right=findTree(in+i+1,pre+i+1,length-i-1); return node; } int length(TreeNode *node) { if(node==NULL) return 0; int l=length(node->left); int r=length(node->right); return l>r?l+1:r+1; } int main() { char in[10000],pre[10000]; int N; cin>>N; char c; for(int i=0;i<N;i++) { cin>>c; pre[i]=c; } for(int i=0;i<N;i++) { cin>>c; in[i]=c; } TreeNode* Node=new TreeNode; Node=findTree(in,pre,N); cout<<length(Node)<<endl; }
[/code]
相关文章推荐
- 在linux的SQL*Plus下用上下键翻历史命令
- 一起talk C栗子吧(第七十回:C语言实例--字符串初始化函数)
- 使用AsyncHttpClient碰到的问题及解决方法
- Android bluetooth开发
- 技巧
- 使用CefSharp在.Net程序中嵌入Chrome浏览器(一)——简介
- 数据库使用实例
- 数据库连接操作
- HDU2859 Phalanx DP
- C++类的析构函数不能抛出异常
- 地址解析协议(APR)
- 一个蒙文系统设计与实现
- Dinic 算法
- 替换字段中第一个相同字符的方法
- 在C++中,关键字explicit的作用
- 使用js获取QueryString的方法小结
- Thinkphp 学习笔记
- border属性黑科技(已被玩坏)
- 02 第一份实习工作之后的三个月
- python写一个日志查询工具(登录ftp服务器得到日志并分析)