sicily 计算二叉查找树的高度 期末考试题

题目

Description

给定一个二叉查找树,要求计算其高度,每个二叉查找树将给出先序与中序的遍历。

例如:一个二叉查找树其先序遍历为:16, 10, 4, 15, 23 ; 中序遍历为 4, 10, 15, 16, 23,则其高度为2(假定空树高度为-1,只有根节点的数高度为0)

Input

第一行输入测试用例个数。

对于每个测试用例,

第一行是节点个数n,第二行是key值的先序遍历,第三行是key值的中序遍历

Output

对于每个测试用例,用一行输出树的高度

Sample Input

Copy sample input to clipboard
2
3
4 5 6
4 5 6
5
6 4 8 9 10
4 6 8 9 10

Sample Output
2
3

思考

1、本题考了两个点,一是通过先序中序构造树,第二个是计算树的高度。

代码

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>
using namespace std;

struct treeNode {
    int data;
    treeNode* left;
    treeNode* right;
    treeNode(int _data) : data(_data), left(NULL), right(NULL) {}
};

treeNode* buildTreeByPreInOrder(vector<int>preOrder, vector<int>inOrder, int preS, int preE, int inS, int inE) {
    if (preS < preE && inS < inE) {
        treeNode* newTree = new treeNode(preOrder[preS]);

        vector<int>::iterator mid = find(inOrder.begin() + inS,inOrder.begin() + inE, preOrder[preS]);

        int span = mid - (inOrder.begin() + inS);

        newTree->left = buildTreeByPreInOrder(preOrder, inOrder, preS + 1, preS + 1 + span, inS, inS + span);

        newTree->right = buildTreeByPreInOrder(preOrder, inOrder, preS + span + 1, preE, inS + span + 1, inE);

        return newTree;
    }
    return NULL;
}

int BT_depth(treeNode* root) {
    if (root == NULL) {
        return -1;
    } else {
        int m = BT_depth(root->left);
        int n = BT_depth(root->right);
        return (m > n) ? (m+1) : (n+1);
    }
}


int main(int argc, const char * argv[]) {
    int test_case;
    cin >> test_case;
    int n;
    vector<int> inorderV, preorderV;
    int i_temp;

    while (test_case--) {
        inorderV.clear();
        preorderV.clear();
        cin >> n;
        for (int i = 0; i < n; i++) {
            cin >> i_temp;
            preorderV.push_back(i_temp);
        }
        for (int i = 0; i < n; i++) {
            cin >> i_temp;
            inorderV.push_back(i_temp);
        }
        treeNode* root = buildTreeByPreInOrder(preorderV, inorderV, 0, preorderV.size(), 0, inorderV.size());
        cout << BT_depth(root) << endl;
    }

    return 0;
}
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/mgsweet/article/details/54172382
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞