概念
二叉排序树需要满足以下性质:
①若根节点的左子树非空,则左子树中所有的结点的值都小于等于根节点的值
②若根节点的右子树非空,与左子树非空时相反
③其左右子树皆为二叉排序树
当然也可以为空。。一棵空树也是一棵二叉排序树
实现
- 构建
- 访问
采用递归的方法构造二叉树
struct TreeNote {
int l, r, data;
};
TreeNote tree[10005];
int buildTree(int pos, int data) {
if (tree[pos].data == 0) {
tree[pos].data=data;
return 0;
}
else if (tree[pos].data > data) {
tree[pos].l=2 * pos;
buildTree(tree[pos].l,data);
}
else {
tree[pos].r=2 * pos + 1;
buildTree(tree[pos].r,data);
}
return 0;
}
时间复杂度经验证一般为
,
当树退化为一条链时,时间复杂度为
访问需对构造好的二叉排序树中序遍历
int inorder(int pos) {
if (tree[pos].data != 0) {
inorder(tree[pos].l);
//printf("%d\n",tree[pos].data);
inorder(tree[pos].r);
}
return 0;
}
亲身感受
这算法我用起来好像特玄学,果然安安静静打快排最踏实
,可能是我太弱了~~(大雾~~