赞
踩
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出为一个整数,即该二叉树的高度。
输出样例:
5
- #include <iostream>
- using namespace std;
-
- struct Node{
- char data;
- Node *left;
- Node *right;
- };
-
- class Tree{
- public:
- int len,i=-1,flag=0;
- string pre,mid;
- Node *root;
- Tree(){
- cin >> len >> pre >> mid;
- }
-
- Node *create(int l, int r){ //建树,根据中序序列界定左右边界
- Node *t = new Node;
- if(flag == 0){ //记录根结点
- root = t;
- flag = 1;
- }
- i++;
- t->data = pre[i]; //根据先序序列依次处理结点
- t->left = NULL; //要初始化NULL,高度计算时必要
- t->right = NULL;
- if(l == r){
- return t;
- }
- int n = toFind(pre[i]); //确定这一字符在中序中的位置,以便将两侧其余结点分左右子树
- t->left = create(l,n-1);
- t->right = create(n+1,r);
- return t;
- }
-
- int toFind(char c){
- for(int k = 0; k < len; k++){
- if(c == mid[k]){
- return k;
- }
- }
- return -1;
- }
-
- int height(Node *t){
- if(t == NULL){
- return 0;
- }else if(t->left == NULL && t->right == NULL) {
- return 1;
- }
- int lheight = height(t->left);
- int rheight = height(t->right);
- if(lheight > rheight){
- return lheight+1;
- }else{
- return rheight+1;
- }
- }
- };
-
- int main()
- {
- Tree tree;
- tree.create(0,tree.len-1);
- int res = tree.height(tree.root);
- cout << res;
- return 0;
- }
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。