题目
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;
}