實現二叉排序樹的難點

2021-10-02 13:14:23 字數 2529 閱讀 6254

二叉排序樹(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...