C++ 二叉搜索树(查找树)的实现

 

头文件

// BinarySearchTree.h 
//普通二叉搜索树的实现
#include <STACK>
using namespace std;

typedef int ElemType;
struct TreeNode
{
    ElemType elem;
    TreeNode *LChildNode;
    TreeNode *RChildNode;
    TreeNode(ElemType &e, TreeNode *lchild, TreeNode *rchild)
        :elem(e), LChildNode(lchild), RChildNode(rchild){}
};

class BinaryTree
{
public:
    BinaryTree();
    virtual ~BinaryTree();

public:
    void insert(ElemType e);
    void remove(ElemType e);
    int find(const ElemType &e);
    void printTree();
    void emptyTree();
private:
    void printTree(TreeNode* &node);
    void GetNodes(stack<TreeNode *> &st, TreeNode* &node);
private:
    TreeNode *m_root;
};




 

实现文件

///////////////////BinarySearchTree.cpp
#include <iostream>
#include "BinarySearchTree.h"
#include <Windows.h>

/////
BinaryTree::BinaryTree()
{
    m_root = NULL;
}

BinaryTree::~BinaryTree()
{
    emptyTree();  //释放结点
}

//插入结点 (非递归方式)
void BinaryTree::insert( ElemType e )
{
    if (!m_root)
    {
        m_root = new TreeNode(e, NULL, NULL);
        return;
    }
    TreeNode *pNode = m_root;
    while(pNode)
    {
        if (e > pNode->elem)
        {
            if (pNode->RChildNode == NULL)
            {
                pNode->RChildNode = new TreeNode(e, NULL, NULL);
                cout << "insert tree node: " << e << " succeed!" <<endl;
                break;
            }
            pNode = pNode->RChildNode;
        }
        else if (e < pNode->elem)
        {
            if (pNode->LChildNode == NULL)
            {
                    pNode->LChildNode = new TreeNode(e, NULL, NULL);
                    cout << "insert tree node: " << e << " succeed!" <<endl;
                    break;
            }
            pNode = pNode->LChildNode;
        }
        else break;
    }
    Sleep(500);
}

//删除指定的结点
void BinaryTree::remove( ElemType e )
{
    TreeNode *pNode = m_root;
    TreeNode *preNode;
    while(pNode)
    {
        if (e < pNode->elem)
        {
            preNode = pNode;
            pNode = pNode->LChildNode;
        }
        else if (e > pNode->elem)
        {
            preNode = pNode;
            pNode = pNode->RChildNode;
        }
        else break;
    }
    if (pNode)
    {
        TreeNode *pTemp = pNode;
        while(pTemp->RChildNode)
        {
            preNode = pTemp;
            pTemp = pTemp->RChildNode;
        }
        if (pTemp && pTemp != pNode)
        {
            ElemType data = pTemp->elem;
            pTemp->elem = pNode->elem;
            pNode->elem = data;
        }
        if (pTemp != pNode && preNode->RChildNode->elem == e)
        {
            if (pTemp->LChildNode)
            {
                preNode->RChildNode = pTemp->LChildNode;
            }
            else
                preNode->RChildNode = NULL;
            delete pTemp;	
        }
        else
        {
            if (pTemp->LChildNode)//移动该结点下的左子树
            {
                preNode->LChildNode = pTemp->LChildNode;
            }
            else
                preNode->LChildNode = NULL;
            delete pTemp;
        }
        cout << "remove  tree node: " << e << " succeed!" <<endl;
    }
    Sleep(500);
}

// 查找树中的某一结点
int BinaryTree::find( const ElemType &e )
{
    TreeNode *pNode = m_root;
    while(pNode)
    {
        if (e < pNode->elem)
        {
            pNode = pNode->LChildNode;
        }
        else if (e > pNode->elem)
        {
            pNode = pNode->RChildNode;
        }
        else break;
    }
    if(pNode) 
    {
        cout << "The elem: " << e
            << " had find in tree."<< endl;
        Sleep(500);
        return 1;
    }
    else 
        return 0;
}

// 用遍历方式打印树的结点
void BinaryTree::printTree()
{
    cout << "print the tree nodes: ";
    if (m_root)
        printTree(m_root);
    else 
        cout << "The Tree is empty !\n";
    cout << endl;
    Sleep(500);
}

void BinaryTree::printTree(TreeNode* &node)
{  //默认为前序遍历
    if (node)
    {
        cout << node->elem << "  ";
        printTree(node->LChildNode);
        printTree(node->RChildNode);
    }
}

// 清空树的结点,释放内存
void BinaryTree::emptyTree()
{
    stack<TreeNode *> stackTree;  //用临时的栈类对象遍历存储整个树的结点
    if (m_root == NULL)
    {
        return;
    }
    GetNodes(stackTree, m_root);//遍历存储整个树的结点
    TreeNode *tempNode = stackTree.top();
    stackTree.pop();
    while(tempNode)
    {
        delete tempNode;
        if (stackTree.size()>0)
        {
            tempNode = stackTree.top();
            stackTree.pop();
        }
        else break;
    }
    m_root = NULL;
    cout << "Emptied The Tree Nodes.\n";
}

void BinaryTree::GetNodes( stack<TreeNode *> &st, TreeNode* &node )
{// 用递归的方法遍历所有结点,存储在栈对象中
    if (node)
    {
        st.push(node);
    }
    else return;
    TreeNode *pLeft = node->LChildNode;
    if (pLeft)
    {
        GetNodes(st, pLeft );
    }
    TreeNode *pRight = node->RChildNode;
    if (pRight)
    {
        GetNodes(st, pRight );
    }
}

 

测试文件

//////Test.cpp for class BinaryTree

#include <iostream>
#include "BinarySearchTree.h"
using namespace std;

int main()
{
    BinaryTree Bitree;
    Bitree.insert(5);
    Bitree.insert(3);
    Bitree.insert(4);
    Bitree.insert(2);
    Bitree.insert(8);
    Bitree.insert(7);
    Bitree.insert(1);
    ElemType elem = 1;
    Bitree.find(elem);

    Bitree.printTree();
    Bitree.remove(2);
    Bitree.insert(6);
    Bitree.printTree();
    Bitree.insert(2);
    Bitree.remove(6);
    Bitree.insert(9);
    Bitree.insert(6);
    Bitree.printTree();
    Bitree.emptyTree();
    Bitree.printTree();
    return 0;
}

 

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/xgx198831/article/details/7335218
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞