当前位置:   article > 正文

8-3 C. 先序+中序还原二叉树

8-3 C. 先序+中序还原二叉树

题目描述

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

输入

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

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出

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

输出样例:

5

代码

  1. #include <iostream>
  2. using namespace std;
  3. struct Node{
  4. char data;
  5. Node *left;
  6. Node *right;
  7. };
  8. class Tree{
  9. public:
  10. int len,i=-1,flag=0;
  11. string pre,mid;
  12. Node *root;
  13. Tree(){
  14. cin >> len >> pre >> mid;
  15. }
  16. Node *create(int l, int r){ //建树,根据中序序列界定左右边界
  17. Node *t = new Node;
  18. if(flag == 0){ //记录根结点
  19. root = t;
  20. flag = 1;
  21. }
  22. i++;
  23. t->data = pre[i]; //根据先序序列依次处理结点
  24. t->left = NULL; //要初始化NULL,高度计算时必要
  25. t->right = NULL;
  26. if(l == r){
  27. return t;
  28. }
  29. int n = toFind(pre[i]); //确定这一字符在中序中的位置,以便将两侧其余结点分左右子树
  30. t->left = create(l,n-1);
  31. t->right = create(n+1,r);
  32. return t;
  33. }
  34. int toFind(char c){
  35. for(int k = 0; k < len; k++){
  36. if(c == mid[k]){
  37. return k;
  38. }
  39. }
  40. return -1;
  41. }
  42. int height(Node *t){
  43. if(t == NULL){
  44. return 0;
  45. }else if(t->left == NULL && t->right == NULL) {
  46. return 1;
  47. }
  48. int lheight = height(t->left);
  49. int rheight = height(t->right);
  50. if(lheight > rheight){
  51. return lheight+1;
  52. }else{
  53. return rheight+1;
  54. }
  55. }
  56. };
  57. int main()
  58. {
  59. Tree tree;
  60. tree.create(0,tree.len-1);
  61. int res = tree.height(tree.root);
  62. cout << res;
  63. return 0;
  64. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/143006
推荐阅读
相关标签
  

闽ICP备14008679号