数据结构——二叉查找树的详细实现(c++)

github地址:https://github.com/lining91/BinTree

本文实现了二叉查找树的前序遍历(递归与非递归)、中序遍历(递归与非递归)、后序遍历(递归与非递归)、插入过程、删除过程、查找过程等。

二叉树的简单介绍:
1、二叉树中的每个节点都不能有多余两个的儿子。
2、二叉树的深度要比N小得多。

假设每个节点被指定一个关键字值(所有关键字是整数、互异的)。

二叉查找树的性质:
1、左子树的所有节点值均小于根节点值。
2、右子树的所有节点值均大于根节点值。
3、左右子树都满足上述两个条件。

插入过程:
1、若当前二叉树为空,则插入的元素为根节点。
2、若插入的元素值小于根节点值,则递归从根节点的左子树中找到可插入位置。
3、若插入的元素值大于根节点值,则递归从根节点的右子树中找到可插入位置。

删除过程:
1、待删除节点Z为叶子节点,则直接删除该节点。修改父节点的指针。
2、待删除节点Z为单支节点(只有左子树或者右子树),让Z的子树与Z的父节点相连,删除节点Z。
3、待删除节点Z左右子树都不为空。
方法一:找到Z的后继节点y,因为y一定没有左子树,所以可以直接删除y,并让y的父亲节点成为y的右子树的父亲节点。用y替换Z。
方法二:找到Z的前驱节点x,x一定没有右子树,所以可以直接删除x,并让x的父亲节点成为x的左子树的父亲节点。用x替换Z。

查找过程:
1、若待查找的元素值和根节点相同,则返回根节点。
2、若待查找的元素值小于根节点的元素值,则递归从根节点的左子树中查找。
3、若待查找的元素值大于根节点的元素值,则递归从根节点的右子树中查找。

遍历过程:
1、前序遍历(递归和非递归两种):先根节点,后左孩子节点,再右孩子结点。
2、中序遍历(递归和非递归两种):先左孩子结点,后根节点,再右孩子结点。
3、后序遍历(递归和非递归两种):先做孩子节点,后右孩子结点,再根节点。

获取最大元素的节点:
1、如果根节点无右子树,则返回根节点。
2、依次查询根节点的右子树节点,返回右子树的最后一个右节点。

获取最小元素的节点:
1、如果根节点无左子树,则返回根节点。
2、依次查询跟节点的左子树节点,返回左子树的最后一个左节点。

依次插入数据(15,3,20,8,10,18,6,1,26)之后的二叉树结构如下:
这里写图片描述

代码如下:

#include <iostream>
#include <stack>
using namespace std;

typedef struct STreeNode* pSTreeNode;
typedef int TreeKeyType;

struct STreeNode 
{
    TreeKeyType key;
    pSTreeNode pLeftChild;
    pSTreeNode pRightChild;

    STreeNode( TreeKeyType Value )
    {
        key = Value;
        pLeftChild = NULL;
        pRightChild = NULL;
    }
};

class CBinTree
{
public:
    CBinTree();
    ~CBinTree();

    void Insert( TreeKeyType Value );
    void Insert( pSTreeNode pNode, TreeKeyType Value );

    pSTreeNode Search( TreeKeyType Value );
    pSTreeNode Search( pSTreeNode pNode, TreeKeyType Value );

    void Delete( TreeKeyType Value );

    void Preorder( );       //  前序遍历,非递归方法(借用堆栈)
    void Inorder( );        //  中序遍历,非递归方法(借用堆栈)
    void Postorder( );      //  后序遍历,非递归方法(借用堆栈)

    void PreorderRecursively( pSTreeNode pNode );   //  前序遍历,递归调用
    void InorderRecursively( pSTreeNode pNode );    //  中序遍历,递归调用
    
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值