7-1 还原二叉树 (25分)

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:

输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:

输出为一个整数,即该二叉树的高度。

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

普通的建树题,从先序找根,然后在中序区分出左子和右子,再递归建树,之后再递归求一下树的高度即可。

代码:

#include
#include
using namespace std;
typedef char ElementType;
typedef struct Node *BinTree;
struct Node {
 ElementType Data;
 BinTree Left;
 BinTree Right;
};
BinTree CreateTree(char pre[], char in[], int n);
int GetTreeHigh(BinTree t);
int main()
{
 int N;
 int h;
 char pre[51], in[51];
 BinTree t;
 cin >> N;
 for (int i = 0; i < N; i++)
  cin >> pre[i];
 for (int i = 0; i < N; i++)
  cin >> in[i];
 t = CreateTree(pre, in, N);
 h = GetTreeHigh(t);
 cout << h;
 return 0;
}
BinTree CreateTree(char pre[], char in[], int n)
{
 BinTree t;
 int i = 0;
 if (n == 0)
  return NULL;
 t = (BinTree)malloc(sizeof(struct Node));
 t->Data = pre[0];
 for (i = 0; i < n; i++)
  if (in[i] == pre[0])
   break;
 t->Left = CreateTree(pre + 1, in, i);
 t->Right = CreateTree(pre + i + 1, in + i + 1, n - i - 1);
 return t;
}
int GetTreeHigh(BinTree t)
{
 if (t == NULL)
  return 0;
 return GetTreeHigh(t->Left) > GetTreeHigh(t->Right) ? GetTreeHigh(t->Left) + 1 : GetTreeHigh(t->Right) + 1;
}

有什么问题欢迎大家在评论区指出,谢谢~

你可能感兴趣的:(7-1 还原二叉树 (25分))