二叉搜索树基本操作实现

Posted evenleo

tags:

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

二叉搜索树又称为二叉排序树,首先二叉搜索树是一棵二叉树,所谓二叉树,就是"任意节点最多允许两个子节点",这两个子节点称为左右子节点。

 二叉搜索树的性质:
1、若左子树不空,则左子树上的所有节点的值均小于其根节点的值;
2、若右子树不空,则右子树上的所有节点的值均大于其根节点的值;
技术分享图片

 上图便是一个二叉搜索树,也就是说:任意节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值。

 下面是自己对二叉搜索树的代码实现:
技术分享图片
#include <iostream>
using namespace std;

struct TreeNode{
    int data;
    TreeNode *left;
    TreeNode *right;
};

//在二叉搜索树查找
TreeNode *search_BST(TreeNode *root, int key)
{
    TreeNode *p = root;
    while(p)
    {
        if(p->data == key)
            return p;
        p = (key < p->data) ? p->left : p->right;
    }
    return NULL;
}

//数据插入到二叉搜索树中
void insert_BST(TreeNode **root, int data)
{
    if(root == NULL)
        return;
    TreeNode *p = (TreeNode *)malloc((sizeof(struct TreeNode)));
    p->data = data;
    p->left = p->right= NULL;
    if(*root == NULL)
    {    
        *root = p;
        return;
    }
    if(search_BST(*root, data) != NULL)
        return;
    TreeNode *preNode = NULL, *curNode = *root;
    while(curNode)
    {
        preNode = curNode;
        curNode = (data < curNode->data) ? curNode->left : curNode->right;
    }
    if(data < preNode->data)
        preNode->left = p;
    else
        preNode->right = p;
}

//创建二叉搜索树
void create_BST(TreeNode **root, int *arr, int len)
{
    for(int i = 0; i < len; i++)
    {
        insert_BST(root, arr[i]);
    }
}

//递归中序遍历树
void minOrderPrint(TreeNode *p)
{
    if(p == NULL)
        return;
    minOrderPrint(p->left);
    cout << p->data << ",";
    minOrderPrint(p->right);
}

//递归先序遍历树
void preOrderPrint(TreeNode *p)
{
    if(p == NULL)
        return;
    cout << p->data << ",";
    preOrderPrint(p->left);
    preOrderPrint(p->right);
}

//用栈的方式非递归先序遍历(注:先进后出)
void preOrderPrintByStack(TreeNode *root) 
{
    TreeNode *stack[100], *p = NULL;
    int top = -1;
    if(root != NULL)
    {
        top++;
        stack[top] = root;
        while(top > -1)
        {
            p = stack[top];

            top--;
            cout << p->data << ",";
            if(p->right != NULL)
            {
                top++;
                stack[top] = p->right;
            }
            if(p->left != NULL)
            {
                top++;
                stack[top] = p->left;
            }
        }
    }
}

//删除数据
void delete_BST(TreeNode **root, int data)
{
    TreeNode *p = *root;
    if(data == p->data)
    {

        if(p->left == NULL && p->right == NULL)
            *root = NULL;
        else if(p->left == NULL)
            *root = p->right;
        else if(p->right == NULL)
            *root = p->left;
        else
        {
            TreeNode *temp = p->right, *find = NULL;
            while(temp != NULL)
            {
                find = temp;
                temp = temp->left;
            }
            find->left = p->left;
            p = p->right;
            *root = p;
        }
    }
    if(data < p->data)
    {
        delete_BST(&p->left, data);
    }
    if(data > p->data)
    {
        delete_BST(&p->right, data);
    }
}

int main()
{
    int arr[] = {17,12,19,10,15,18,25,8,11,13,16,22};
    int len = sizeof(arr) / sizeof(arr[0]);
    TreeNode *node = NULL;
    create_BST(&node, arr, len);
    preOrderPrint(node);
    cout << endl;
    delete_BST(&node, 11);
    preOrderPrint(node);
    cout << endl;
    //preOrderPrintByStack(node);
    system("pause");
    return 0;
}
技术分享图片

 

以上是关于二叉搜索树基本操作实现的主要内容,如果未能解决你的问题,请参考以下文章

二叉树基本操作方法的递归调用实现

二叉树基本操作

二叉树二叉树基本操作通用接口

转 二叉树之Java实现二叉树基本操作

数据结构与算法(周鹏-未出版)-第六章 树-6.3 二叉树基本操作的实现

C站万字详解二叉树基本操作演示程序(附图)