昨天碰到了二叉搜索树(BST)这种数据结构,索性详细的学习了一遍。
BST的定义:
如果一棵树的左子树不为空,那么其所有节点的值均小于其根结点的值,如果右子树不为空,那么其所有节点的值均大于其根结点的值,它的左右子树也满足如上性质。空树也是BST。
我的BST的实现是以没有重复元素为前提,其实有重复元素也无大碍,只是把实现过程中相关的<改成<=即可,
节点结构定义:
class Node{
public:
int val;
Node *left, *right;
Node() {}
Node(int val) : val(val), left(NULL), right(NULL) {}
};
BST结构定义及实现方法:
class BST{
private:
Node *root;
void Recursion_Insert_Node(Node *&node, int x);//递归插入结点
void Non_Recursion_Insert_Node(Node **node, int x);//非递归插入结点
Node *Recursion_Find_Node(Node *node, int x);//递归查找结点
Node *Non_Recursion_Find_Node(Node *root, int x);//非递归查找结点
void Delete_Node(Node **root, int x);//删除结点
void preOrder_Traverse(Node *root);//前序遍历
void inOrder_Traverse(Node *root);//中序遍历
void postOrder_Traversal(Node *root);//后序遍历
void Delete_BST(Node *node);//释放空间
public:
BST();
~BST();
void Create_BST(int *num, int n);//创建BST
Node *Find_Node(int x);
void Delete_Node(int x);
void preOrder_Traverse();
void inOrder_Traverse();
void postOrder_Traversal();
};
让我们首先来看看插入结点是如何实现的:
对于第一个要存入的值,我们将它设置为根结点,然后对于小于根结点的值,我们将其移动到左子树上再进行比较,直到移动到成为叶子节点即可,大于根结点的值同理。
具体实现:
递归:
void BST::Recursion_Insert_Node(Node *&node, int x){
if(node == NULL){
node = new Node(x);
}
else if(node->val > x){
Recursion_Insert_Node(node->left, x);
}
else if(node->val < x){
Recursion_Insert_Node(node->right, x);
}
}
非递归:
void BST::Non_Recursion_Insert_Node(Node **root, int x){
Node *p = *root;
Node *fa = *root;
while(p){
if(p->val == x){
printf("%d is already exist!\n", x);
return;
}
fa = p;
if(p->val > x){
p = p->left;
}
else{
p = p->right;
}
}
if(fa == NULL){
*root = new Node(x);
}
else