二叉搜索树的插入

Posted siwuxie095

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉搜索树的插入相关的知识,希望对你有一定的参考价值。

--------------------siwuxie095

   

   

   

   

   

   

   

   

二叉树的插入

   

   

程序:

   

BST.h:

   

#ifndef BST_H

#define BST_H

   

#include "stdlib.h"

#include <queue>

   

   

//二叉搜索树

template <typename Key, typename Value>

class BST

{

   

private:

   

struct Node

{

Key key;

Value value;

Node *left;

Node *right;

   

Node(Key key, Value value)

{

this->key = key;

this->value = value;

this->left = this->right = NULL;

}

   

Node(Node *node)

{

this->key = node->key;

this->value = node->value;

this->left = node->left;

this->right = node->right;

}

};

   

   

Node *root; //根节点

int count;

   

   

public:

   

BST()

{

root = NULL;

count = 0;

}

   

   

~BST()

{

destroy(root);

}

   

   

int size()

{

return count;

}

   

   

bool isEmpty()

{

return count == 0;

}

   

   

//向整棵二叉树树中插入新元素转换成向一个子树中插入新元素

//直到子树是空的时候,新建一个节点,这个新建的节点就是一

//棵新的子树,只不过它只有一个节点,将它直接返回回去

//

//这样,通过递归的方式向二叉搜索树中插入了一个新的元素

void insert(Key key, Value value)

{

root = insert(root, key, value);

}

   

   

bool contain(Key key)

{

return contain(root, key);

}

   

   

//search()函数常见的返回形式:

//1Node*,缺点:对外界来说,没有将数据结构Node进行隐藏

//2Value,缺点:如果查找不到的话,不知道该返回什么数值

//3Value*,优点:作为一个指针可以存一个空元素

Value *search(Key key)

{

return search(root, key);

}

   

   

// 前序遍历

void preOrder()

{

preOrder(root);

}

   

   

// 中序遍历:会将二叉搜索树的key从小到大进行排序

void inOrder()

{

inOrder(root);

}

   

   

// 后序遍历

void postOrder()

{

postOrder(root);

}

   

   

// 层序遍历

void levelOrder()

{

//需要引入队列:先进先出

queue<Node*> q;

q.push(root);

while (!q.empty())

{

   

Node *node = q.front();

q.pop();

   

cout << node->key << endl;

   

//如果node的左孩子不为空

if (node->left)

{

q.push(node->left);

}

//如果node的右孩子不为空

if (node->right)

{

q.push(node->right);

}

}

}

   

   

// 寻找最小的键值

Key minimum()

{

assert(count != 0);

Node *minNode = minimum(root);

return minNode->key;

}

   

   

// 寻找最大的键值

Key maximum()

{

assert(count != 0);

Node *maxNode = maximum(root);

return maxNode->key;

}

   

   

// 从二叉树中删除最小值所在节点

void removeMin()

{

//根节点不为空,才能做事情

if (root)

{

root = removeMin(root);

}

}

   

// 从二叉树中删除最大值所在节点

void removeMax()

{

if (root)

{

root = removeMax(root);

}

}

   

   

// 从二叉树中删除键值为key的节点

void remove(Key key)

{

root = remove(root, key);

}

   

   

private:

   

// 向以node为根的二叉搜索树中,插入节点(key, value)

// 返回插入新节点后的二叉搜索树的根

Node *insert(Node *node, Key key, Value value)

{

//递归到底的情况:如果一个节点都没有,

//创建一个新节点作为子树的根

if (node == NULL)

{

count++;

return new Node(key, value);

}

   

   

//如果新插入节点的key等于当前节点的key,做更新操作即可

if (key == node->key)

{

node->value = value;

}

else if (key < node->key)

{

node->left = insert(node->left, key, value);

}

else

{

// key > node->key

node->right = insert(node->right, key, value);

}

   

return node;

}

   

   

// 查看以node为根的二叉搜索树中是否包含键值为key的节点

bool contain(Node *node, Key key)

{

//如果当前访问的节点已经为空,

//即不包含,直接返回false即可

if (node == NULL)

{

return false;

}

   

   

if (key == node->key)

{

return true;

}

else if (key < node->key)

{

return contain(node->left, key);

}

else

{

// key > node->key

return contain(node->right, key);

}

}

   

   

// 在以node为根的二叉搜索树中查找key所对应的value

Value *search(Node *node, Key key)

{

   

if (node == NULL)

{

return NULL;

}

   

   

if (key == node->key)

{

return &(node->value);

}

else if (key < node->key)

{

return search(node->left, key);

}

else

{

// key > node->key

return search(node->right, key);

}

}

   

   

// 对以node为根的二叉搜索树进行前序遍历

void preOrder(Node *node)

{

   

if (node != NULL)

{

cout << node->key << endl;

preOrder(node->left);

preOrder(node->right);

}

}

   

   

// 对以node为根的二叉搜索树进行中序遍历

void inOrder(Node *node)

{

   

if (node != NULL)

{

inOrder(node->left);

cout << node->key << endl;

inOrder(node->right);

}

}

   

   

// 对以node为根的二叉搜索树

以上是关于二叉搜索树的插入的主要内容,如果未能解决你的问题,请参考以下文章

C++-二叉搜索树的查找&插入&删除-二叉搜索树代码实现-二叉搜索树性能分析及解决方案

19. 二叉搜索树的插入删除修剪

二叉搜索树的理解以及AVL树的模拟实现

二叉搜索树的理解以及AVL树的模拟实现

数据结构与算法 通俗易懂讲解 二叉搜索树插入删除

C++二叉搜索树解析

(c)2006-2024 SYSTEM All Rights Reserved IT常识