1、二叉查找树非空,n个节点
存储的结构为;
struct node{
int key;
int n; //以该节点为根的子树的所有孩子个数
struct node *left, *right;
};
(1)找到二叉查找树的最小关键字和最大关键字
思路: 最小关键字:最左节点
最大关键字:最右节点
//最左边为最小关键字
node *search_min(node *root){
node *t = root;
while(t->left != NULL){
t = t->left;
}
return t;
}
//最右边为最大关键字
node *search_max(node *root){
node *t = root;
while(t->right != NULL){
t = t->right;
}
return t;
}
(2)求二叉树第k小元素,关键字(n>=k>=1),要求时间复杂度不超过log
递归出口: k节点的值大于root节点值,或者k小于1,直接返回null
判断条件:
- 左子树长度比较
- 左子树个数刚好为k-1,那么根节点就是要找的节点
- 左子树个数大于k,必然要在左子树中继续找第k小元素
- 左子树个数小于k,在右子树找k-left-1的小元素(减去左子树以及根节点的个数)
//2、求二叉树第k小的元素关键字,时间复杂度为不能超过 log
int Search_ksmall(node *root, int k){
if(root == NULL) return 0; //递归出口
int leftnum = root->left->n; //得到以root为根节点的左子树孩子节点个数
if(k == leftnum + 1) return root->data; //如果左子树个数为k-1,直接返回根节点
else if(leftnum >= k) return Search_ksmall(root->left,k); //左子树个数大于k,继续在左子树中找
else return Search_ksmall(root->right, k-leftnum-1); //在右子树中找
}//算法的时间复杂度为log2n