二叉搜索树的一些操作的C++实现

头文件:

#include<iostream>
using namespace std;
typedef struct BiTNode
{
    int data;
    int key;
    struct BiTNode *parent, *lchild, *rchild;
}BiTNode, *BiTree;
BiTree Tree_Search(BiTree x, int k);
void Tree_Walk(BiTree x);
BiTree Tree_Minimun(BiTree x);
BiTree Tree_Maximun(BiTree x);
void Tree_Insert(BiTree &T, BiTree z);
void Tree_Delete(BiTree &T, BiTree z);
void Transplant(BiTree &T, BiTree u, BiTree v);

实现部分:

#include "searchTree.h"
BiTree Tree_Search(BiTree x, int k)  //查找二叉搜索树。Tree-Search返回一个指向关键字为key的节点的指针;否则返回NULL
{
    if ((x == NULL) || (k == x->key))
    {
        return x;
    }
    if (k < x->key)
    {
        return Tree_Search(x->lchild, k);
    }
    else
    {
        return Tree_Search(x->rchild, k);
    }
}
void Tree_Walk(BiTree x)  //遍历
{
    if (x != NULL)
    {
        Tree_Walk(x->lchild);
        cout << x->key << endl;
        Tree_Walk(x->rchild);
    }
}
BiTree Tree_Minimun(BiTree x)
{
    while (x->lchild != NULL)
    {
        x = x->lchild;
    }
    return x;
}
BiTree Tree_Maximun(BiTree x)
{
    while (x->rchild != NULL)
    {
        x = x->rchild;
    }
    return x;
}
void Tree_Insert(BiTree &T,BiTree z)
{
    BiTree y = NULL;
    BiTree x = T;
    while (x != NULL)
    {
        y = x;
        if (z->key < x->key)
        {
            x = x->lchild;
        }
        else
        {
            x = x->rchild;
        }
    }
    z->parent = y;
    if (y == NULL)
    {
        T = z;
    }
    else if (z->key < y->key)
    {
        y->lchild = z;
    }
    else
    {
        y->rchild = z;
    }
}
void Transplant(BiTree &T, BiTree u, BiTree v)
{
    if (u->parent == NULL)
    {
        T = v;
    }
    else if (u == u->parent->lchild)
    {
        u->parent->lchild = v;
    }
    else
    {
        u->parent->rchild = v;
    }
    if (v != NULL)
    {
        v->parent = u->parent;
    }
}
void Tree_Delete(BiTree &T, BiTree z)
{
    if (z->lchild == NULL)
    {
        Transplant(T, z, z->rchild);
    }
    else if (z->rchild == NULL)
    {
        Transplant(T, z, z->lchild);
    }
    else
    {
        BiTree y = Tree_Minimun(z->rchild);
        if (y->parent != z)
        {
            Transplant(T, y, y->rchild);
            y->rchild = z->rchild;
            y->rchild->parent = y;
        }
        Transplant(T, z, y);
        y->lchild = z->lchild;
        y->lchild->parent = y;
    }
}
int main()
{
    BiTree oldTree = NULL;
    for (int i = 0; i < 10; ++i)
    {
        BiTree testNode = new BiTNode();
        testNode->key = rand()%100;
        Tree_Insert(oldTree, testNode);
    }
    Tree_Walk(oldTree);
    cout << "The Max is   " << Tree_Maximun(oldTree)->key << endl;
    cout << "The Max is   " << Tree_Minimun(oldTree)->key << endl;
    Tree_Delete(oldTree, Tree_Maximun(oldTree));
    Tree_Delete(oldTree, Tree_Minimun(oldTree));
    Tree_Walk(oldTree);
    return 0;
}
时间: 2024-10-15 11:13:10

二叉搜索树的一些操作的C++实现的相关文章

C++实现二叉搜索树的常用操作

实现操作 (1)二叉搜索树的建立 (2)二叉搜索树的插入 (3)二叉搜索树的三种递归遍历(前序.中序和后续) (4)二叉搜索树的三种非递归遍历(前序.中序和后续) (5)二叉搜索树的逐层打印 (6)搜索某一个字符(递归算法) (7)搜索一个字符(非递归算法) (8)查找最大元素 (9)查找最小元素 有时间再实现: (10)二叉搜索树的前驱和后继查找 (11)二叉搜索树的删除 源码分析: #include <iostream> #include <stack> #include &l

二叉搜索树的删除操作详解(BST)

一.思想:分类讨论 二.二叉搜索树的删除操作具体讨论分如下四种情况:(记我们要删除的节点为D) 1.如果D节点既没有左孩子,也没有右孩子,那么直接删除就好了: 2.如果D节点只有左孩子,没有右孩子,那么只需要把该D节点左孩子链接到D节点的父亲节点,然后删除D节点就好了: 3.如果D节点只有右孩子,没有左孩子,那么只需要把该D节点右孩子链接到D节点的父亲节点,然后删除D节点就好了: 4.如果D节点既有左孩子,又有右孩子,那么需要找到D节点的右子树的最小值节点,找到之后直接替换掉D节点,然后删除找到

二叉搜索树的相关操作

操作包括二叉搜索树的创建,插入,搜索,寻找前驱后继,删除,左右旋转,插入元素为根结点,以及两棵二叉树的合并. 二叉树的创建很简单,只需要设置 value, left child, right child 即可. 插入的时候递归插入树中合适的位置,通过比较插入元素的值与根结点元素的值,如果小于则递归插入到左子树中,否则递归插入到右子树中. 搜索的时候与插入类似,比较要搜索的值和根结点元素值的大小,若小于则递归到左子树中去查找,否则递归到右子树中去查找. 寻找前驱的方式是在左子树的右结点中去递归寻找

数据结构 - 从二叉搜索树说到AVL树(一)之二叉搜索树的操作与详解(Java)

二叉搜索树(Binary Search Tree),简称BST,顾名思义,一颗可以用于搜索的二叉树.BST在数据结构中占有很重要的地位,一些高级树结构都是其的变种,例如AVL树.红黑树等,因此理解BST对于后续树结构的学习有很好的作用.同时利用BST可以进行排序,称为二叉排序,也是很重要的一种思想. 二叉树的性质:任意一个节点的所有左子树元素都比该元素值要小,而所有右子树元素都比该元素值要大. 符合该性质的二叉树就是一颗二叉搜索树,当然前提下是树中不允许有重复元素. 所有的二叉搜索树的中序遍历序

算法导论第十二章 二叉搜索树

一.二叉搜索树概览 二叉搜索树(又名二叉查找树.二叉排序树)是一种可提供良好搜寻效率的树形结构,支持动态集合操作,所谓动态集合操作,就是Search.Maximum.Minimum.Insert.Delete等操作,二叉搜索树可以保证这些操作在对数时间内完成.当然,在最坏情况下,即所有节点形成一种链式树结构,则需要O(n)时间.这就说明,针对这些动态集合操作,二叉搜索树还有改进的空间,即确保最坏情况下所有操作在对数时间内完成.这样的改进结构有AVL(Adelson-Velskii-Landis)

二叉搜索树以及对二叉搜索树平衡调整

代码的思想和图片参考:好大学慕课浙江大学陈越.何钦铭的<数据结构> 我们首先介绍一下什么是二叉搜索树和二叉平衡树: 二叉搜索树:一棵二叉树,可以为空:如果不为空,满足以下性质1. 非空左子树的所有键值小于其根结点的键值.2. 非空右子树的所有键值大于其根结点的键值.3. 左.右子树都是二叉搜索树. 二叉搜索树操作的特别函数:Position Find( ElementType X, BinTree BST ):从二叉搜索树BST中查找元素X,返回其所在结点的地址,查找的次数取决于树的高度  

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

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

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

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

二叉搜索树的局限性

-------------------siwuxie095 二叉搜索树的局限性 二叉搜索树在时间性能上是具有局限性的 同样的数据,可以对应不同的二叉搜索树,如下: 二叉搜索树可能退化成链表,相应的,二叉搜索树的查找操作是和这棵树 的高度相关的,而此时这颗树的高度就是这颗树的节点数 n,同时二叉搜 索树相应的算法全部退化成 O(n) 级别 显然,说二叉搜索树的查找.插入.删除 这三个操作都是 O(lgn) 级别的, 只是一个大概的估算,具体要和二叉搜索树的形状相关 二叉搜索树并不能像堆那样,保证所