数据结构与算法C++之二分搜索树的遍历

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/majinlei121/article/details/84144491

二分搜索树的遍历分为三种,前序遍历,中序遍历,后序遍历
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
前面介绍的前中后序遍历都是深度优先遍历
下面介绍一种广度优先遍历,二叉树中称为层序遍历
所谓层序遍历就是一层层遍历树的元素,下图中遍历顺序为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--;
        }
    }
};

猜你喜欢

转载自blog.csdn.net/majinlei121/article/details/84144491
今日推荐