二叉排序樹的完整實現

2021-06-28 13:51:39 字數 3188 閱讀 1850

在排序中,之前利用大小根堆的方式,保持最小值或者最大值在堆頂端

二叉排序樹是保持這棵樹一直是有序的

二叉排序樹的建立,不同於堆操作只需要對非葉子節點進行處理,保持其大於左右孩子,或者是小於左右孩子,而是需要對每乙個點都進行處理,因為他是相對而言更加

嚴謹的操作

查詢乙個資料:對於大根堆操作,如果當前值小於根節點,那麼這個值在左右分支出現都是由可能得,但是對於bst,如果小那麼肯定在左分支,如果大,那麼肯定在右分支

刪除乙個元素:對於堆,一般都是由於排序會刪除堆頂元素,那麼刪除之後由最後乙個元素補上,然後再檢驗其情況

對於二叉樹,如果刪除的元素只有乙個孩子,那麼由這個孩子代替,如果有兩個孩子,那麼在右分支中找到最小的元素代替

#include #include using namespace std;  

//二叉排序樹,完成建立節點,插入節點,刪除節點,查詢節點,中序遍歷的功能

//節點類定義

class node

node(int num):data(num),parent(null),left(null),right(null){}

};

//二叉排序樹類定義

class tree;

//建構函式中建立二叉排序樹

//首先生成根節點,然後迴圈呼叫插入節點函式使二叉排序樹進行插入操作

tree::tree(int num, int len)

else if (datadata)

else if (data==p->data)

} newnode->parent=par;

if (par->data>newnode->data)

else

par->right=newnode;

} //插入節點操作

//插入資料為引數data的節點,遞迴方法,內部呼叫了private成員函式insertnode()

void tree::insertnode(int data)

} //遞迴插入方法

void tree::insertnode(node *current, int data)

else

insertnode(current->left,data);//對左節點進行遞迴呼叫

} else if (data>current->data)

else

insertnode(current->right,data);//對右節點進行遞迴呼叫

} return; //data等於當前節點資料時,不插入

} //遞迴查詢方法

node* tree::searchnode(node *current, int data)

return searchnode(current->left,data);

} else if (data>current->data)

return searchnode(current->right,data);

} return current;//如果相等返回current

} //查詢節點

node* tree::searchnode(int data)

return searchnode(root,data);

} //刪除資料為data的節點及其子樹

void tree::deletenode(int data)

} //刪除current節點及其子樹的所有節點

void tree::deletenode(node *current)

if (current->right!=null)

if (current->parent==null)

//將current父親節點的相應指標置空

if (current->parent->data>current->data)

else

//最後刪除此節點

delete current;

} //中序遍歷,遞迴方法

void tree::inordertree(node *current)

} //中序遍歷

void tree::inordertree()

if (!s.empty())

} } int main()

; tree t(num,4);

node *p=null;

t.inordertree();

cout/*二叉排序樹*/

#include #include #define _crtdbg_map_alloc

typedef struct nodenode;

void nodeinit(node *n,int val)

void buildpoint(int val,node * root)

else

}if (val >= root->data)

else

}}void buildbst(int *a, int size,node * root) //《建立二叉排序樹,每乙個節點都需要

} void scanbst(node * root) //《類似於中序遍歷

if (root->left)

printf("%d ",root->data);

if (root->right) }

void destorypoint(node *root) //《刪除記憶體

delete root;

root = null;

if (right) }

int main(int argc, char *argv)

; int size = sizeof(a)/sizeof(int);

node * root = new node;

buildbst(a,size,root);

scanbst(root);

destorypoint(root); //《如果沒有這個,會產生相應的記憶體洩露

_crtdumpmemoryleaks();

return 0;

}

二叉排序樹的實現

二叉排序樹是一顆特殊的二叉樹 對於樹上的任意乙個結點,根節點的值一定大於其左子樹上的任意結點的值,一定小於其右子樹上任意結點的數值。所以我們可以插入實現二叉排序樹,思路可以這樣 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...