Description
给定一个二叉排序树和一个整数k,要求输出树中第k个最小元素(k从1开始计数)。
Input
第一行输入t,表示有t个测试样例。
第二行起,首先输入n,接着输入n个整数表示一个二叉排序树,接着输入k。
以此类推共输入t个测试样例。
数组形式的二叉树表示方法与题目:DS二叉树_伪层序遍历构建二叉树 相同,输入-1表示空结点。
Output
每一行输出当前二叉排序树的第k个最小元素。
共输出t行。
Sample
#0
Input
45
3 1 4 -1 2
18
5 3 6 2 4 -1 -1 1
31
1
17
55 36 72 15 37 58 79
6
Output
1
3
1
72
Hint
设树中的结点数目为m。
1 <= k <= m
1 <= 结点值
AC代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;// 二叉排序树节点
struct TreeNode {int data;TreeNode* left;TreeNode* right;TreeNode(int val) : data(val), left(nullptr), right(nullptr) {}
};// 插入节点到二叉排序树
TreeNode* insert(TreeNode* root, int data) {if (root == nullptr) {return new TreeNode(data);}if (data < root->data) {root->left = insert(root->left, data);}else {root->right = insert(root->right, data);}return root;
}//在二叉排序树中,第一小的数一定在最左下角,其次第二小的数就是第一小的数的爹结点,第三小的数则是第三小的兄弟结点
// 正好符合了中序遍历的顺序
// 中序遍历并将结果存储在数组中
void inorderTraversal(TreeNode* root, vector<int>& result) {if (root != nullptr) {inorderTraversal(root->left, result);result.push_back(root->data);inorderTraversal(root->right, result);}
}// 寻找树中第k个最小元素
int kthSmallest(TreeNode* root, int k) {vector<int> result;inorderTraversal(root, result);return result[k - 1];
}int main() {int t;cin >> t;for (int i = 0; i < t; ++i) {int n;cin >> n;TreeNode* root = nullptr;for (int j = 0; j < n; ++j) {int data;cin >> data;if (data == -1)continue;root = insert(root, data);}int k;cin >> k;int kth = kthSmallest(root, k);cout << kth << endl;}return 0;
}