在排序中,之前利用大小根堆的方式,保持最小值或者最大值在堆頂端
二叉排序樹是保持這棵樹一直是有序的
二叉排序樹的建立,不同於堆操作只需要對非葉子節點進行處理,保持其大於左右孩子,或者是小於左右孩子,而是需要對每乙個點都進行處理,因為他是相對而言更加
嚴謹的操作
查詢乙個資料:對於大根堆操作,如果當前值小於根節點,那麼這個值在左右分支出現都是由可能得,但是對於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...