赞
踩
给定一个二叉排序树和一个整数k,要求输出树中第k个最小元素(k从1开始计数)。
第一行输入t,表示有t个测试样例。
第二行起,首先输入n,接着输入n个整数表示一个二叉排序树,接着输入k。
以此类推共输入t个测试样例。
数组形式的二叉树表示方法与题目:DS二叉树_伪层序遍历构建二叉树 相同,输入-1表示空结点。
每一行输出当前二叉排序树的第k个最小元素。
共输出t行。
#0
4 5 3 1 4 -1 2 1 8 5 3 6 2 4 -1 -1 1 3 1 1 1 7 55 36 72 15 37 58 79 6
1
3
1
72
设树中的结点数目为m。
1 <= k <= m
1 <= 结点值
#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; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。