您的位置:首页 > 其它

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

2017-01-07 11:48 239 查看

题目

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息