二叉搜索树基本操作实现

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

二叉搜索树的性质:

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;
}

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

时间: 2024-10-08 05:21:48

二叉搜索树基本操作实现的相关文章

二叉搜索树(Java实现)

二叉搜索树基本操作 求树中的结点个数 判断节点是否为空 向树中插入新结点key-value 树中是否存在key 返回树中key对应的value值 先序遍历 中序遍历 后续遍历 层序遍历 求树中key最小的结点 求树中key最大的结点 删除树中key最小的结点 删除树中key最大的结点 树中删除一个结点 代码: /** * @param <Key> 键的泛型 * @param <Value> 值的泛型 */ public class BinarySearchTree<Key e

判断一棵树是否是二叉搜索树

前两天写过一篇博文<二叉搜索树基本操作实现>,为了更深入了解二叉搜索树的性质,本文实现判断一棵树是否为二叉搜索树算法. 二叉搜索树的性质: 任意节点的键值一定大于其左子树中的每一个节点的键值,并小于其右子树中的每一个节点的键值. 构造二叉树的节点定义为: struct TreeNode{ int data; TreeNode *left; TreeNode *right; }; 方法1 (错误) 对每一个节点,检测其值是否大于左子树节点,是否小于右子树节点.思路很简单,代码实现如下: bool

二叉搜索树&mdash;&mdash;算法导论(14)

1. 什么是二叉搜索树     顾名思义,二叉搜索树是以一棵二叉搜索树来组织的.如下图,这样的一棵树可以使用一个链表数据结构来表示,其中的每一个节点是一个对象.除了key和卫星数据之外,每个节点还包含属性left(左孩子).right(右孩子).和p(双亲)(若不存在,则值为NIL).     二叉搜索树中的关键字总是以满足二叉搜索树性质的方式存储: 设x是二叉搜索树的一个节点.如果y是x左子树中的一个节点,那么y.key≤x.key.如果y是x右子树中的一个节点,那么y.key≥x.key.

平衡二叉搜索树(AVL树)的原理及实现源代码(有图文详解和C++、Java实现代码)

一.AVL树(平衡二叉搜索树)是什么? AVL树是根据它的发明者G.M. Adelson-Velsky和E.M. Landis命名的.AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树. 2.带有平衡条件:每个非叶子结点的左右子树的高度之差的绝对值(平衡因子)最多为1. 例如: 5             5 / \            /  \ 2   6         2   6 / \    \         / \ 1  4   7       1  4

【算法导论】学习笔记——第12章 二叉搜索树

搜索树数据结构支持多种动态集合操作,包括SEARCH.MINIMUM.MAXIMUM.PREDECESSOR.SUCCESSOR.INSRT和DELETE操作等.基本的搜索树就是一棵二叉搜索树.12.1 什么是二叉搜索树1. 二叉搜索树的性质:设x是二叉搜索树中的一个结点.如果y是x左子树中的一个结点,那么y.key<=x.key.如果y是x右子树中的一个结点,那么y.key>=x.key.三种遍历时间复杂度是O(n),这是显然的. 12.1-3 1 void Inorder_Tree_Wal

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

数据结构(三):非线性逻辑结构-特殊的二叉树结构:堆、哈夫曼树、二叉搜索树、平衡二叉搜索树、红黑树、线索二叉树

在上一篇数据结构的博文<数据结构(三):非线性逻辑结构-二叉树>中已经对二叉树的概念.遍历等基本的概念和操作进行了介绍.本篇博文主要介绍几个特殊的二叉树,堆.哈夫曼树.二叉搜索树.平衡二叉搜索树.红黑树.线索二叉树,它们在解决实际问题中有着非常重要的应用.本文主要从概念和一些基本操作上进行分类和总结. 一.概念总揽 (1) 堆 堆(heap order)是一种特殊的表,如果将它看做是一颗完全二叉树的层次序列,那么它具有如下的性质:每个节点的值都不大于其孩子的值,或每个节点的值都不小于其孩子的值

数据结构 ---- 二叉搜索树

一直对于二叉搜索树(又叫二叉排序树,也叫二叉查找树),没有很好的理解,决定花点时间来学习and总结.. 二叉搜索树也是二叉树的一种.(就像堆也就二叉树的一种一样...) 只不过,二叉搜索树也是有其他要求:对于所有的子树,其根节点的值大于左子树上的所有结点的值,而小于右子树上所有结点的值的值.. 对于错误的理解:对于所有的结点,要大于其左结点,小于其右结点..(PS:这种理解是错误的,一定要注意..) 还有一点需要注意的是:我们的大于和小于都应该是严格的. ========== 下面主要针对,其建