1. 程式人生 > 其它 >查詢演算法:二叉排序樹

查詢演算法:二叉排序樹

二叉排序樹,又稱二叉查詢樹,是一種對排序和查詢都很有用的特殊二叉樹

  1. 定義
    二叉排序樹或者是一棵空樹,或者具有以下定義:
    1)若左子樹不為空,左子樹上所有結點值均小於根結點值;
    2)若右子樹不為空,右子樹上所有結點值均大於根結點值;
    3)左右子樹也分別為二叉排序樹。

遞迴定義。有定義可得性質:中序遍歷二叉樹可得到結點遞增的有序序列。

  1. 查詢
    模仿折半查詢易得非遞迴查詢演算法,以下給出遞迴形式
BSTree searchBST(BSTree T, KeyType key) {
  if (!T || T.data == key) return T;  // 找到則返回T,找不到則返回空
  else if (T.data < key) return SearchBST(T.right, key);
  else return SearchBST(T.left, key);
}

演算法分析:
二叉排序樹上的查詢和折半查詢相差不大。但二叉排序樹可更好地維護表的有序性,無需移動記錄,只需移動指標即可完成插入和刪除操作。
因此,對需要經常進行插入、刪除和查詢運算的表,採用二叉排序樹比較好。

  1. 插入
    當樹中不存在關鍵字等於key的結點時才進行插入。
    新插入的結點一定是一個新新增的葉子結點(?一定是葉子結點?),且是查詢不成功時查詢路徑上訪問的最後一個結點的左孩子或右孩子節點。
void insertBST(BSTree T, ElementType e) {
  if (!T) {
    S = new BSTNode;
    S.data = e;
    S.lchild = S.rchild = NULL;
    T = S;
  }
  else if (T.data > e.data) insertBST(T.lchild, e);
  else if (T.data < e.data) insertBST(T.rchild, e);
}
  1. 建立
void createBST(BSTree T) {
  T = NULL;
  cin>>e;  // 輸入e
  while(e.key != ENDFLAG){ // ENDFLAG為自定義常量,作為輸入結束標誌
    insertBST(T, e);
    cin>>e;
  }
}
  1. 刪除(待補充......)