59.二叉搜索树的第k个结点
题目内容:
代码及思路:
#include<iostream>
#include<vector>
using namespace std;
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
};
class Solution {
public:
void buildTree(TreeNode** root)
{
int temp;
cin >> temp;
if (temp == 0)
{
(*root)->val = 0;
(*root) = nullptr;
return;
}
else
{
(*root)->val = temp;
(*root)->left = new TreeNode();
buildTree(&(*root)->left);
(*root)->right = new TreeNode();
buildTree(&(*root)->right);
}
}
//二叉树的中序遍历是排序的,因此只要通过二叉搜索树的中序遍历
//就可以很容易的找到第k小的结点
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if (pRoot == nullptr||k==0)
return nullptr;
return KthNode_core(pRoot, k);
}
TreeNode* KthNode_core(TreeNode* pRoot, int& k)
{
TreeNode* target = new TreeNode();
target = nullptr;
//中序遍历,先左子结点后父节点,最后右子结点
if (pRoot->left)
{
target=KthNode_core(pRoot->left, k);
}
if (target == nullptr)
{
if (k == 1)
target=pRoot;
k--;
}
if (target == nullptr&&pRoot->right != nullptr)
{
target = KthNode_core(pRoot->right, k);
}
return target;
}
};
void main()
{
Solution* object = new Solution();
TreeNode* target = new TreeNode();
TreeNode* pRoot = new TreeNode();
object->buildTree(&pRoot);
int k;
cin >> k;
target = object->KthNode(pRoot, k);
}