二叉树的高度(卡玛网KamaCoder 第23题)

一. 申明:

该题目来自卡玛网KamaCoder https://kamacoder.com/

二. 题目描述

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

输入描述

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

输出描述

对于每组输入,输出一个整数,即该二叉树的高度。

输入示例
9
ABDFGHIEC
FDHGIBEAC
7
Abcdefg
gfedcbA
输出示例
5
7

 三. 解题思路

1. 流程如图:  

 2. 解题步骤

  • 第一步:如果字符串为空的话,说明是空节点了。

  • 第二步:如果不为空,那么取前序字符串的第一个元素作为节点元素。

  • 第三步:找到前序字符串第一个元素在中序字符串的位置,作为切割点

  • 第四步:切割中序字符串,切成中序左字符串和中序右字符串 (顺序别搞反了,一定是先切中序字符串)

  • 第五步:切割前序字符串,切成前序左字符串和前序右字符串

  • 第六步:递归处理左区间和右区间

  • 第七步:二叉树构造完成后返回根节点

  • 第八步:计算二叉树的高度(递归和非递归两步)

3. 代码展示

#include<iostream>
#include<vector>
#include<string>
#include<queue>
using namespace std;

struct TreeNode{
  char val;
  TreeNode* left;
  TreeNode* right;
  TreeNode(char x):val(x), left(nullptr), right(nullptr){}
};

TreeNode* creatTree(string& pre, string& in){   // 通过前序和中序构造二叉树
    if(pre.size() == 0) return nullptr;
    TreeNode* root = new TreeNode(pre[0]);
    int index = 0;
    for(int i = 0; i < in.size(); i++){
        if(in[i] == pre[0]){
            index = i;
            break;
        }
    }
    
    //  切中序的左右子树
    string leftIn(in.begin(), in.begin() + index);
    string rightIn(in.begin() + index + 1, in.end());
    
    // 删除前序的第一位(二叉树根节点)
    pre.erase(pre.begin());
    
    // 切前序的左右子树
    string leftPre(pre.begin(), pre.begin() + leftIn.size());
    string rightPre(pre.begin() + leftIn.size(), pre.end());
    
    // 递归构造root的左右子树
    root->left = creatTree(leftPre, leftIn);
    root->right = creatTree(rightPre, rightIn);
    
    return root;
}

// // 计算二叉树的最大高度(层序,非递归)
// int treeHight(TreeNode* root){
//     queue<TreeNode*> que;
//     if(root) que.push(root);
//     int height = 0;
//     while(!que.empty()){
//         int size = que.size();
//         while(size--){
//             TreeNode* node = que.front();
//             que.pop();
//             if(node->left) que.push(node->left);
//             if(node->right) que.push(node->right);
//         }
//         height++;
//     }
//     return height;
// }


// 深搜求最大高度(递归)
int maxD = 0;
void height(TreeNode* root, int deep){
    if(root == nullptr) return;
    else{
        deep++;
        height(root->left, deep);
        height(root->right, deep);
        maxD = max(maxD, deep);
    }
}

int main(){
    int n;
    string s1, s2;
    while(cin >> n >> s1 >> s2){
        TreeNode* root = creatTree(s1, s2);
        // cout << treeHight(root) << endl;
        height(root, 0);
        cout << maxD << endl;
    }
    return 0;
}

四. 总结 

该类题目属于二叉树基础题目,卡码网和力扣中都有相关题目,建议多练习一下,稳固二叉树的基础知识。每天都会更新一些数据结构相关题目,感兴趣的话就关注一下吧!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值