给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数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; }