二叉排序樹(bst)就是對於樹中任意節點都具有「左子樹所有節點 < 根節點 < 右子樹所有節點」的性質。下面用**簡單實現乙個儲存int型資料的二叉排序樹:
#include
"pch.h"
#include
#include
#include
//節點結構體
struct node
node
(const node& node)
:data
(node.data)
,parent
(null),
left
(null),
right
(null
)node
(int num)
:data
(num)
,parent
(null),
left
(null),
right
(null)};
class
bstree
}void
deletetree
(node* nodep)
}//遞迴呼叫的中序遍歷內部實現
void
lnrshow1
(node *p)
else
}public
:bstree()
:root
(null
)bstree
(int num)
//拷貝建構函式
bstree
(const bstree& tree)
}//析構函式要遍歷所有節點釋放資源
~bstree()
//插入資料
void
insertdata
(int data)
node* p = root;
while
(p)else
}else
else}}
}//查詢資料節點
node*
search
(int data)
else
if(p-
>data > data)
else
}return p;
}//刪除節點
bool
deletenode
(node* p)
if(p-
>left ==
null
&& p-
>right ==
null
)//刪除沒有子節點的節點
else
if(p-
>left ==
null
)//刪除只有右子節點的節點
else
}else
if(p-
>right ==
null
)//刪除只有左子節點的節點
else
}else
//刪除有兩個子節點的節點
minp-
>data ^
= p-
>data;
p->data ^
= minp-
>data;
minp-
>data ^
= p-
>data;
res =
deletenode
(minp)
;//轉換成刪除它
}return res;
}//刪除資料
bool
deletedata
(int data)
//提供給外部呼叫的中序遍歷函式
void
lnrshow()
//提供給外部呼叫的層次遍歷
void
showbylevel()
std::cout << std::endl;}}
;
實現需要注意的點:
1、刪除具有兩個子節點的節點p。首先找到該節點右子樹最小的節點minp,將該p與minp的資料交換,因為minp的值比左子樹的節點大,又比右子樹其它節點小,所以適合做根節點。接著問題轉為刪除minp節點,直接遞迴刪除就行了。
2、任何需要釋放節點的操作都要注意把父節點指向它的指標置null。同理,生成新的節點必須設定其父節點指標。
3、用非遞迴方法進行中序遍歷比較難,**如下:
void bstree::
unreslnrshow()
if(!s.empty()
)}std::cout<}
基本思路就是先尋找最小的節點,依次入棧,從最小節點開始,先輸出該節點的值,然後將右子樹作為新的遍歷目標遍歷,用棧代替遞迴。其實沒啥意義。
4、按層次遍歷,先遍歷第一層,接著遍歷第二層,依次類推。需要用到佇列,根節點先入列,然後每次出列,都把該出列的節點的左節點和右節點入列。
5、中序遍歷輸出的資料是排好序的,可以使用中序遍歷的方法判斷乙個二叉樹是不是二叉排序樹。
6、實現拷貝建構函式和析構函式需要進行遞迴遍歷。
二叉排序樹的實現
二叉排序樹是一顆特殊的二叉樹 對於樹上的任意乙個結點,根節點的值一定大於其左子樹上的任意結點的值,一定小於其右子樹上任意結點的數值。所以我們可以插入實現二叉排序樹,思路可以這樣 1 若當前樹為空,則x為根節點 2 如果樹不為空,比較根節點與之大小,若插入值小於根節點,就繼續比較跟節點的左子樹,即最終...
二叉排序樹的實現
二叉排序 搜尋 樹是以關鍵碼為結點的二叉樹,其性質 如果任一結點的左子樹非空,則左子樹的所有結點的關鍵碼都小於根結點的關鍵碼 如果任一結點的右子樹非空,則右子樹的所有結點的關鍵碼都大於根結點的關鍵碼。二叉排序樹的儲存結構如下,typedef struct binsortnode pbinsortno...
二叉排序樹的實現
包括二叉排序樹的增加 遍歷和刪除 include include typedef int mytype 二叉排序樹 typedef struct structtreebtree btree init void addchild btree tree,int num void printtree bt...