二叉排序樹

2021-06-16 15:01:11 字數 4140 閱讀 4279

二叉排序樹又名二叉查詢樹,其定義如下:

二叉樹的定義如下:

//定義二叉查詢樹的節點

templatestruct treenode

;

二叉排序樹的查詢演算法如下:

//在二叉樹head中查詢關鍵字為key的元素,

//若存在返回true,p指向該節點

//若不存在返回false,p指向該插入到的節點

template bool searchbst(treenode* head,t key,treenode* f,treenode* &p)

else if(head->key==key)

else if(keykey)

else

}//searchbst的非遞迴實現

template bool searchbst(treenode* head,t key,treenode* &p)

if(q==null)//查詢不成功

else//q!=null 查詢成功

}

二叉排序樹插入操作演算法

//當二叉排序樹head中不存在關鍵字為key的資料元素時,插入key返回true

templatebool insertbst( treenode* & head,t key)

return true;

} return false;

}

二叉排序樹刪除操作(二叉樹的難點)

下面演算法採用如下方法刪除節點;

1,若果p(要刪除節點)的左子樹為空,則令p的右子樹成為p的雙親f的左子樹或者右子樹(根據p的key值與f的key值判斷)。即用p的右子樹代替p.

2,若果p(要刪除節點)的右子樹為空,則令p的左子樹成為p的雙親f的左子樹或者右子樹(根據p的key值與f的key值判斷)。即用p的左子樹代替p.

3,如果p的左右子樹都不為空,則找到二叉樹中序遍歷時p的直接前驅pre,用pre代替p。

執行如下操作: (a):p->key=pre->key; (b) s->rchild=pre->lchild (s為pre的雙親) (c)刪除s 

//刪除關鍵字為key的元素(遞迴實現)

templatebool deletebst(treenode* &head,t key)

}template bool deletebst(treenode* &p)//執行實際的刪除操作

else if(!p->rchild)//p的右子樹為空

else//p的左右子樹都不為空

//用s代替p

p->key=s->key;

if(p!=q)

q->rchild=s->lchild;

else//p==q

q->lchild=s->lchild;

delete s;

}return true;

}//刪除關鍵字為key的元素(非遞迴實現)

templatebool _deletebst(treenode* &head,t key)

if(!p)

return false;//關鍵字為key的元素不存在

//else存在

if(!p->lchild)//p的左孩子不存在

}else if(!p->rchild)//p的右孩子不存在

}else //p的左右孩子都存在

p->key=pre->key;

if(q!=p)

q->rchild=pre->lchild;

else

q->lchild=pre->lchild;

p=pre;

}delete p;

return true;

}

總體**如下:

// 二叉查詢樹

#include "stdafx.h"

#include using namespace std;

//定義二叉查詢樹的節點

templatestruct treenode

;//在二叉樹head中查詢關鍵字為key的元素,

//若存在返回true,p指向該節點

//若不存在返回false,p指向該插入到的節點

template bool searchbst(treenode* head,t key,treenode* f,treenode* &p)

else if(head->key==key)

else if(keykey)

else

}//searchbst的非遞迴實現

template bool searchbst(treenode* head,t key,treenode* &p)

if(q==null)//查詢不成功

else//q!=null 查詢成功

} //當二叉排序樹head中不存在關鍵字為key的資料元素時,插入key返回true

templatebool insertbst( treenode* & head,t key)

return true;

} return false;

}//刪除關鍵字為key的元素(遞迴實現)

templatebool deletebst(treenode* &head,t key)

}template bool deletebst(treenode* &p)//執行實際的刪除操作

else if(!p->rchild)//p的右子樹為空

else//p的左右子樹都不為空

//用s代替p

p->key=s->key;

if(p!=q)

q->rchild=s->lchild;

else//p==q

q->lchild=s->lchild;

delete s;

}return true;

}//刪除關鍵字為key的元素(非遞迴實現)

templatebool _deletebst(treenode* &head,t key)

if(!p)

return false;//關鍵字為key的元素不存在

//else存在

if(!p->lchild)//p的左孩子不存在

}else if(!p->rchild)//p的右孩子不存在

}else //p的左右孩子都存在

p->key=pre->key;

if(q!=p)

q->rchild=pre->lchild;

else

q->lchild=pre->lchild;

p=pre;

}delete p;

return true;

}//中序遍歷二叉查詢樹

template void printbst(treenode* head)

int _tmain(int argc, _tchar* argv)

{ treenode* head=null;

treenode* p=null;

insertbst(head,45);

insertbst(head,24);

insertbst(head,53);

insertbst(head,45);

insertbst(head,12);

insertbst(head,24);

insertbst(head,90);

printbst(head);//構造的二叉樹如下圖所示

本文參考 資料結構(c語言版 嚴蔚敏) 9.21節

二叉排序樹

在複習資料結構,把這個東西總結一下。這種結構是動態查詢表,這種動態是相對靜態查詢 順序查詢,折半查詢,分塊查詢等 來說的。對於各種靜態鍊錶,要達到查詢複雜度為o logn 必須要求有序 而要使插入刪除複雜度為o 1 必須是鍊錶儲存。動態查詢表就可以同時滿足這兩者。動態查詢表的特點是表結構本身在查詢過...

二叉排序樹

name 二叉排序樹相關操作 author unimen date 2011 10 8 13 14 21 刪除結點比較麻煩,總結如下 4大種情況 1 結點p無右孩子 將該點的左孩子變為其在雙親中的同位孩子 1 p為其雙親的左孩子時將其的左孩子變為雙親的左孩子 2 p為其雙親的右孩子時將其的左孩子變為...

二叉排序樹

include include include include struct tree node void insert node struct tree node int void pre order struct tree node void in order struct tree node ...