leetcode刷题日记——二叉搜索树中第 K 小的元素
[ 题目描述 ]:
[ 思路 ]:
- 可以通过中序遍历二叉搜索树获取节点的有序数列,然后通过访问第 k-1 个元素,来获取第 k 小的值
- 运行如下
void getInOrder(struct TreeNode* root,int* inOrder,int* returnSize){if(!root){return ;}getInOrder(root->left,inOrder,returnSize);inOrder[(*returnSize)++]=root->val;getInOrder(root->right,inOrder,returnSize);
}int kthSmallest(struct TreeNode* root, int k) {int inOrder[10000];int returnSize=0;getInOrder(root,inOrder,&returnSize);return inOrder[k-1];
}
[ 官方题解 ]:
- 方法一:中序遍历,通过栈实现存储,大致思路一致
- 方法二:记录子树的结点数,令 node 等于根结点,开始搜索。
- 如果 node 的左子树的结点数 left 小于 k−1,则第 k 小的元素一定在 node 的右子树中,令 node 等于其的右子结点,k 等于 k−left−1,并继续搜索;
- 如果 node 的左子树的结点数 left 等于 k−1,则第 k 小的元素即为 node ,结束搜索并返回 node 即可;
- 如果 node 的左子树的结点数 left 大于 k−1,则第 k 小的元素一定在 node 的左子树中,令 node 等于其左子结点,并继续搜索。
- 方法三:平衡二叉搜索树