二分搜索树的遍历分为三种,前序遍历,中序遍历,后序遍历
前面介绍的前中后序遍历都是深度优先遍历
下面介绍一种广度优先遍历,二叉树中称为层序遍历
所谓层序遍历就是一层层遍历树的元素,下图中遍历顺序为28->16->30->13->22->29->42
(1)具体实现步骤为,首先将根节点28推入队列中,front表示队首
(2)然后进行一次循环,只要队列中不为空,那么就将队列中的元素28推出队列,同时,还要将28的左右节点16和30推入队列中
(3)然后继续循环,将队首的16推出队列,同时将16的左右节点13和22推入队列
(4)继续循环,将队首的30推出队列,同时将30的左右节点29和42推入队列
(5)继续循环,将13推出队列,同时将13的左右节点推入队列,但13已没有左右节点,那么就推出下一个元素22,22也没有左右节点,就继续推出29,29也没有左右节点,就推出42,42也没有左右节点,遍历结束
四种遍历的效率是很高的,算法复杂度都是O(n)
下面是四种遍历方式的程序实现
#include <iostream>
#include <vector>
#include <string>
#include <ctime> //time()函数
#include <queue>
#include "FileOps.h"
using namespace std;
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 *root;
int count;
public:
BST(){
root = NULL;
count = 0;
}
~BST(){
// TODO: ~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);
}
Value *search(Key key){
return search(root, key);
}
//前序遍历
void preOrder(){
preOrder(root);
}
//中序遍历
void inOrder(){
inOrder(root);
}
//后序遍历
void postOrder(){
postOrder(root);
}
//层序遍历
void levelOrder(){
quene<Node*> q;
q.push(root);
while( !q.empty() ){
Node *node = q.front();
q.pop();
cout<<node->key<<endl;
if (node->left)
q.push(node->left);
if (node->right)
q.push(node->right);
}
}
private:
//向以node为根的二叉搜索树中,插入节点(key, value)
//返回插入新节点后的二叉搜索树的根
//递归插入
Node* insert(Node *node, Key key, Value value){
if (node == NULL){
count++;
return new Node(key, value);
}
if(node->key == key)
node->value = value;
else if (key < node->key)
node->left = insert(node->left, key, value);
else
node->right = insert(node->right, key, value);
return node;
}
//查找以node为根的二叉搜索树中是否包含键值为key的节点
bool contain(Node *node, Key key){
if (node == NULL){
return false;
}
if (key == node->key)
return true;
else if (key < node->key)
return contain(node->left, key);
else
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
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为根的二叉搜索树进行后序遍历
void postOrder(Node *node){
if(node != NULL){
postOrder(node->left);
postOrder(node->right);
cout<<node->key<<endl;
}
}
void destroy(Node *node){
if (node != NULL){
destroy(node->left);
destroy(node->right);
delete node;
count--;
}
}
};