码迷,mamicode.com
首页 > 其他好文 > 详细

二叉搜索树基本操作实现

时间:2018-02-26 18:59:00      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:creat   gpo   top   roo   AC   main   std   delete   nod   

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

 二叉搜索树的性质:
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;
}
技术分享图片

 

二叉搜索树基本操作实现

标签:creat   gpo   top   roo   AC   main   std   delete   nod   

原文地址:https://www.cnblogs.com/evenleee/p/8474505.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!