二叉排序樹又名二叉查詢樹,其定義如下:
二叉樹的定義如下:
//定義二叉查詢樹的節點
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 ...