二叉排序树

159 阅读2分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

1.特点:

根结点有左子树,则左子树的所有结点都小于根结点的值

根结点有右子树,则右子树的所有结点都大于根节点的值

根结点的左右子树同时也是二叉 排序树

2.查找

二叉排序树的查找算法和我们再前面文章分享过程中提到的折半查找类似。可以来看下二叉排序树是如何实现的:

BiTree Search(BiTree T,KeyType key){
  if(!T || key = T->data){
    return T;
  }
  else if(key < T->data){
    return Search(T->lchild,key);  //遍历左孩子
  }else{
    return Search(T->rchild,key);  //遍历右孩子
  }
}

3. 如何构造一棵排序二叉树?

说明:首先构造二叉排序树就相当于将给定的序列进行插入 所以了解如何插入二叉排序树就能知道如何构建二叉排序树 而插入二叉排序树就很好理解,根据插入的结点去和二叉排序树的顶点比较去选择和左子树比较还是和右子树比较,最后将结点插入二叉树的最后面。而构造二叉树则需要遍历准备插入的二叉树序列,一个数调用一次插入方法 即可

typedef struct BSTNode { 
KeyType key; 
BSTNode *lchild,*rchild;
}BSTNode,*BSTree;

int inseartBiTree(BSTree *p,KeyType key){
  if(p == null){
    p = (BSTNde*)malloc(sizeof(BSTNode));
    p->key = key;
    p->lchild = p->rchild = NULL;
    return 1;
  }
  else if(p = p->key){  return 0;}
  else if(key < p->key) { return inseartBiTree(p->lchild, key);}
  else if(key > p->key) { return inseartBiTree(p->rchild, key);}
}

//生成二叉排序树
BSTNode *createTree(KeyType A[], int n){
  BSTNode *bt = NULL;
  while(i<n){
    inseartBiTree(bt,A[i]);
   i++;
  }
 return bt;
}

4.删除

二叉树的删除操作相对来说要复杂一些,它要分几种情况进行删除

1.若删除结点为叶子结点 可以直接删除

2.若删除结点只有左子树或右子树结点 则删除该结点,将其左子树或右子树整体移动到删除结点位置(继承结点)

3.若删除结点左右子树都有,则删除完结点后,则是可以将他的左子树中最小的一个结点值(最右)替代删除结点位置;或者将右子树中最小的结点值(最左)替代删除结点

可以看下面的图结合上面的删除进行理解

769ee9dd24317d8e1c2deb704b85f38.png