【算法设计-二叉搜索树】二叉查找树的操作与实现

二叉查找树某个结点的左子树的值都比它小,其右子树的值比它大。

要实现的主要操作

代码实现

#include <iostream>

using namespace std;

// BST的结点

typedef struct node

{

int key;

struct node *lChild, *rChild,*parent;

}Node, *BST;

BST lvis=NULL;//用来保存父节点的地址

void createBST(BST &p);

void assignmentParent(BST p);//给所有的结点的父节点赋值。

// 在给定的BST中插入结点,其数据域为element, 使之称为新的BST

bool BSTInsert(Node *&p, int element)

{

if (p == NULL)

{

p = new Node;

p->key = element;

p->lChild = p->rChild = NULL;

}

if (element == p->key)

{

return false;

}

if (element < p->key)

{

BSTInsert(p->lChild, element);

}

else

BSTInsert(p->rChild, element);

return true;

}

void PrintBST(BST &p, int depth)

{

BST &p1=p;

int i;

if (p1->rChild)

PrintBST(p1->rChild, depth + 1);

for (i = 1; i <= depth; i++)

printf("     ");

printf("%d\n", p1->key);

if (p1->lChild)

PrintBST(p1->lChild, depth + 1);

}

BST search(BST p, int key)

{

if (p == NULL)

{

printf("此树为空!\n");

return NULL;

}

else if (key == p->key)

{

printf("查找成功!,%d的地址是%p\n", key, p);

return p;

}

else if (key < p->key)

search(p->lChild, key);

else

search(p->rChild, key);

}

void createBST(BST &p)

{

int t;

int depth = 0;

p = NULL;

printf("\n请输入关键字(以-123结束建立平衡二叉树):");

scanf("%d", &t);

while (t != -123)

{

BSTInsert(p, t);

printf("\n请输入关键字(以-123结束建立平衡二叉树):");

scanf("%d", &t);

}

assignmentParent(p);//这个函数的目的是为了给所有节点的父节点赋值。

printf("\n****************************************************\n");

printf("*******************您创建的二叉树为*******************\n");

if (p)

PrintBST(p, depth);

else

printf("这是一棵空树!\n");

printf("********************二叉树创建完成*********************\n");

}

void Maximum(BST p)

{

BST p1=p;

while(p1->rChild)

{

p1=p1->rChild;

}

printf("Maximum=%d",p1->key);

}

void Minmum(BST p)

{

BST p1=p;

while(p1->lChild)

{

p1=p1->lChild;

}

printf("Minimum=%d",p1->key);

}

bool Insert(BST &p,int element)

{

if (p == NULL)

{

p = new Node;

p->key = element;

p->lChild = p->rChild = NULL;

}

if (element == p->key)

{

return false;

}

if (element < p->key)

{

Insert(p->lChild, element);

}

else

Insert(p->rChild, element);

return true;

}

void get_parent(BST &p)

{

if (p)

{

printf("%d->parent=%p",p->key,p->parent);

get_parent(p->lChild);

get_parent(p->rChild);

}

}

void assignmentParent(BST p)

{

if (p)

{

p->parent=lvis;

lvis=p;

assignmentParent(p->lChild);

lvis=p;

assignmentParent(p->rChild);

}

}

//先序遍历

void preorderBST(BST p)

{

if (p)

{

cout << p->key << " ";

preorderBST(p->lChild);

preorderBST(p->rChild);

}

}

//中序遍历(这个可以做为排序算法

void inorderBST(BST p)

{

if (p)

{

inorderBST(p->lChild);

cout << p->key << " ";

inorderBST(p->rChild);

}

}

//后序遍历

void postrderBST(BST p)

{

if (p)

{

postrderBST(p->lChild);

postrderBST(p->rChild);

cout << p->key << " ";

}

}

void Delete(BST p,int key)

{

BST p1=p;

//删除要分三种情况

while(p1->key!=key)

{

if(key>p1->key)

p1=p1->rChild;

else

p1=p1->lChild;

}

//第一种情况:如果z没有孩子结点,则只是简单的将它删除,并修改它的父节点。用NIL作为孩子来替换z(现在还没有考虑其为根节点)

if(p1->lChild==NULL&&p1->rChild==NULL)

{

if(p1->parent==NULL)

{

printf("已经删除根节点!,此时树为空哦\n");

p=NULL;

return;

}

if(p1->key<p1->parent->key)

p1->parent->lChild=NULL;

else

p1->parent->rChild=NULL;

}

//第二种情况:如果只有一个孩子,则将这个孩子提升到树中z的位置上,并修改z的父节点,用z的孩子来替换z

{

if(p1->lChild!=NULL&&p1->rChild==NULL)

{

if(p1->key<p1->parent->key)

{

p1->parent->lChild=p1->lChild;

p1->lChild->parent=p1->parent;

}

else

{

p1->parent->rChild=p1->lChild;

p1->lChild->parent=p1->parent;

}

}

if(p1->rChild!=NULL&&p1->lChild==NULL)

{

if(p1->key<p1->parent->key)

{

p1->parent->lChild=p1->rChild;

p1->rChild->parent=p1->parent;

}

else

{

p1->parent->rChild=p1->rChild;

p1->rChild->parent=p1->parent;

}

}

//第三种情况

if(p1->lChild!=NULL&&p1->rChild!=NULL)

{

Node *y=p1->rChild->lChild;

while(y!=NULL)

y=y->lChild;

//先用y的右孩子替换y

y->rChild->parent=y->parent;

//用y替换z

y->rChild=p1->rChild;

p1->rChild->parent=y;

y->lChild=p1->lChild;

p1->lChild->parent=y;

y->parent=p1->parent;

if(p1->parent->key>p1->key)

p1->parent->lChild=y;

else

p1->parent->rChild=y;

}

}

}

int main(void)

{

int ch;

BST T;

printf("请写入您要建立的BST树的所有结点值!\n");

createBST(T);

while (1)

{

printf("\n***************************************\n");

printf("*****按下列选项选择您要进行的操作******\n");

printf("*****1前序输出.************************\n");

printf("*****2.中序输出************************\n");

printf("*****3.后序输出************************\n");

printf("*****4.查找****************************\n");

printf("*****5.求最大值************************\n");

printf("*****6.求最小值************************\n");

printf("*****7.插入数值************************\n");

printf("*****8.获得父节点地址******************\n");

printf("*****9.删除数值************************\n");

printf("*****10.打印排序二叉树*****************\n");

printf("*****11.退出***************************\n");

printf("***************************************\n");

scanf("%d", &ch);

switch (ch)

{

case 1:

preorderBST(T); break;

case 2:

inorderBST(T); break;

case 3:

postrderBST(T);break;

case 4:

{

int m;

printf("您要查找的是多少:");

scanf("%d", &m);

search(T, m);

}

break;

case 5:

Maximum(T); break;

case 6:

Minmum(T);break;

case 7:

{

printf("您要插入多少:");

int key;

scanf("%d",&key);

Insert(T,key);

}break;

case 8:

get_parent(T);

break;

case 9:

{

printf("您要删除多少:");

int key;

scanf("%d",&key);

Delete(T,key);

}

break;

case 10:

PrintBST(T,0);

break;

case 11:

return 0; break;

default:

break;

}

}

return 0;

}

删除操作详解

时间: 2024-11-10 13:33:45

【算法设计-二叉搜索树】二叉查找树的操作与实现的相关文章

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

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

70 数组的Kmin算法和二叉搜索树的Kmin算法对比

[本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Kmin算法非常类似,其本质是找序列中的第K大或者第K小的元素,可以借鉴QuickSort的思想加以实现. [Kmin_of_Array] C++ Code 1234567891011121314151617181920212223242526272829303132333435363738394041

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

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

二叉搜索树的相关操作

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

数据结构与算法之二叉搜索树

与链表不同,树是一种非线性的数据结构.树中最常用的是二叉树,二叉树限制了子树的数量,也就是每个结点的子树至多2个,并且这两个子树是有顺序的.而二叉搜索树(二叉查找树,二叉排序树)是指根节点的关键字大于左子树的,而小于右子树,并且,左右子树也是一颗二叉搜索树.也就是说中序遍历一颗二叉搜索树,它的输出是从小到大排序好的. 除了普通的二叉搜索树之外,还有很多关于它的变形. 二叉平衡搜索树,即即是一颗二叉平衡树,也是一颗搜索树,平衡树即任意一个结点的左子树的高度与右子树的高度之差的绝对值不大于1. 红黑

一步两步学算法之二叉搜索树

Binary Search Tree  又叫二叉查找树,二叉排序树 这是种什么样的树呢? 其实就是根节点的左子树比根节点小  右子树比根节点大  同时 左子树和右子树也是二叉搜索树 代码比较简单 基本用递归实现 比较好理解  只有删除带有左右子树的节点时比较难理解 方法就是 直接在右子树找一个最小的节点 取代要被删除的节点 再继续删除右子树里的节点 详细看代码 1 #include "stdio.h" 2 #include "stdlib.h" 3 typedef

算法导论—二叉搜索树(BST)

华电北风吹 天津大学认知计算与应用重点实验室 日期:2015/9/9 与散列表一样,搜索树数据结构也支持动态集合操作,包含插入,查询,删除,最小值,最大值,前驱,后继等. 一.二叉搜索树: 二叉搜索树节点:关键字key,卫星数据,左孩子指针,右孩子指针,父节点指针,其他特殊类型(红黑树的节点颜色,AVL树的树高等). 二叉搜索树性质:x是二叉搜索树中的任意一个节点.若y是x左子树中任意一个节点有x.key>=y.key.若y是x右子树中任意一个节点有x.key<=y.key. 二.二叉搜索树的

C++算法之 二叉搜索树转换为双向链表

题目: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的方向: 分析: 1:由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点.当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可.进而更新当前链表的最后一个结点指针. 2:由于中序遍历过程正好是转换成链表的过程,即可采用递归处理 代码: // BT.cpp : 定义控制台应用程序的

二叉搜索树的一些操作的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); BiTre