C语言实现二叉排序树
程序以'#'结尾的二叉排序树.
/*
(双重指针 BSTree *T)
问:数据结构中 二叉树建立结点为什么用 双重指针?详细解释下双重指针
答:指针的指针.
因为树的结点要用指针描述.
如果只用指针,作形参传给建立结点的函数,这个指针值传给了函数栈中的内存,函数
返回后,函数栈销毁,不能获得结点.
而用指针的指针,函数内修改了这个双重指针指向的值(即结点指针),在函数外也能获得结点.
这swap()函数要用指针而不能用值做参数一样.只是这里的值本身就是个指针,所以要用指针的指针.
*/
/*BinarySortTree*/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stack>
#define SIZE 30
using namespace std; /*二叉排序树*/
typedef struct Node
{
int data;
struct Node *rchild,*lchild;
}*BSTree;
stack<char> s;
/*顺序表*/
struct SeqList
{
char data[SIZE];
};
/*创建顺序表*/
SeqList Create_SeqList(SeqList L)
{
gets(L.data);
return L;
}
/*插入构造二叉排序树*/
void Insert_BSTree(BSTree *T,char data)
{
BSTree s; //新节点作为子节点或者根节点
//树为空,创建根节点
if(*T==NULL)
{
s = (BSTree)malloc(sizeof(struct Node));
s->data = data;
s->lchild=NULL;
s->rchild=NULL;
*T=s;
}
//小插左大插右相等扔掉
else if(data<(*T)->data)Insert_BSTree(&((*T)->lchild),data);
else if(data>(*T)->data)Insert_BSTree(&((*T)->rchild),data);
}
/*插入创建二叉排序树*/
void Create_BSTree(BSTree *T,SeqList L)
{
*T=NULL;
int k=0;
char ch = L.data[k++];
while(ch!='#')
{
Insert_BSTree(T,ch);
ch = L.data[k++];
}
}
/*利用栈中序遍历二叉排序树*/
void StackInOrderTraverse(BSTree root)
{
if(root!=NULL)
{
StackInOrderTraverse(root->lchild);//遍历左子树
s.push(root->data);
StackInOrderTraverse(root->rchild);//遍历柚子树
}
else
{
stack<char> s1;//辅助栈
//输出
while(!s.empty())
{
s1.push(s.top());
s.pop();
}
while(!s1.empty())
{
printf("%c",s1.top());
s1.pop();
}
}
} /*中序遍历二叉排序树*/
void InOrderTraverse(BSTree root)
{
if(root!=NULL)
{
InOrderTraverse(root->lchild);//遍历左子树
printf("%c",root->data);
InOrderTraverse(root->rchild);//遍历柚子树
}
}
/*删除功能(好难)*/
void Delete_BSTree(BSTree *T,char data)
{
BSTree p;
BSTree p_parent;//保存p的双亲节点
BSTree s,s_parent;
p = *T;
while(p)
{
if(p->data==data) //找到了
break;
p_parent = p; //记录前驱赋初值
if(p->data>data) //根节点大的话找左子树
p = p->lchild;
else p = p->rchild;
}
if(p==NULL)
{
printf("删除失败,没有这个数据\n");
return;
}
//左子树没有的话,p可能是右子树也可能是叶子
if(p->lchild==NULL)
{
//根节点
if(p_parent==NULL){
*T = p->rchild;
}
//p是双亲的左子树
else if(p_parent->lchild==p){
p_parent->lchild = p->rchild; //将其右子树作为它双亲的左孩子
}
else p_parent->rchild = p->rchild; //将其右子树作为它双亲的右孩子
free(p);
}
//左子树有的话,p可能只有左子树或者右子树左子树都有
else {
s_parent = p;
s = p->lchild;
//找到p的最右下结点
while(s->rchild){
s_parent = s;
s = s->rchild;
}
//如果p是s的双亲节点
if(s_parent==p){
s_parent->lchild = s->lchild; //将s的右子树作为它右儿子
}else s_parent->rchild = s->lchild;
p->data = s->data;
free(s);
}
printf("删除成功,删除后的序列为:\n");
InOrderTraverse(*T);
}
int main()
{
stack<char> s;
char data;
SeqList List;
BSTree root=NULL;
List = Create_SeqList(List);
Create_BSTree(&root,List);
InOrderTraverse(root);
printf("\n");
StackInOrderTraverse(root);
printf("\n");
printf("输入你想删除的数据:");
scanf("%c",&data);
Delete_BSTree(&root,data);
printf("\n");
return 0;
}

C语言实现二叉排序树的更多相关文章
- 二叉排序树插入C语言版 递归步骤理解
//二叉排序树 插入 (纯C语言实现) BTNode * BSTInsert2(BTNode *bt,int key){ //为什么纯C语言实现中 if(bt==NULL){ //要写成 bt-> ...
- c语言编程之二叉排序树
二叉排序树,又称为二叉查找树.它是一颗空树,或者是具有下面的性质的二叉树: 1.若它的左子树不空,则左子树上所有节点的值均小于它的根结构的值: 2.若它的右子树不空,则右子树上所有节点的值均大于它的根 ...
- C语言——二叉排序树
二叉排序树是一种实现动态查找的树表,又称二叉查找树. 二叉排序树的性质: 1. 若它的左子树不为空,则左子树上所有节点的键值均小于它的根节点键值 2. 若它的右子树不为空,则右子树上所有节点的键值均大 ...
- 二叉排序树思想及C语言实现
转自: http://blog.chinaunix.net/uid-22663647-id-1771796.html 1.二叉排序树的定义 二叉排序树(Binary Sort Tree)又称二叉查找( ...
- [数据结构 - 第6章] 树之二叉排序树(C语言实现)
一.什么是二叉排序树? 对于普通的顺序存储来说,插入.删除操作很简便,效率高:而这样的表由于无序造成查找的效率很低. 对于有序线性表来说(顺序存储的),查找可用折半.插值.斐波那契等查找算法实现,效率 ...
- 二叉查找树(二叉排序树)(C语言)
#include<stdio.h> #include "fatal.h" struct TreeNode; typedef struct TreeNode *Posit ...
- 伸展树(一)之 图文解析 和 C语言的实现
概要 本章介绍伸展树.它和"二叉查找树"和"AVL树"一样,都是特殊的二叉树.在了解了"二叉查找树"和"AVL树"之后, ...
- POJ 2418 各种二叉排序树
题意很明确,统计各个字符串所占总串数的百分比,暴力的话肯定超时,看了书上的题解后发现这题主要是用二叉排序树来做,下面附上n种树的代码. 简单的二叉排序树,不作任何优化(C语言版的): #include ...
- 七大查找算法(附C语言代码实现)
来自:Poll的笔记 - 博客园 链接:http://www.cnblogs.com/maybe2030/p/4715035.html 阅读目录 1.顺序查找 2.二分查找 3.插值查找 4.斐波那契 ...
随机推荐
- JSP页面中的Meta标签详解
Meta标签详解 相信大家在平时开发中最常接触的页面就是html和jsp了,可在这两个页面中有一个Meta标签你天天都会看见,可是你真的了解这个标签的一些其他用处吗?今天给大家介绍一些该标签的其他应用 ...
- STL之四:list用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8520891 list容器介绍 相对于vector容器的连续线性空间,list是一个双 ...
- Saddle Point ZOJ - 3955 题意题
Chiaki has an n × m matrix A. Rows are numbered from 1 to n from top to bottom and columns are numbe ...
- CMDB服务器管理系统【s5day88】:兼容的实现
比较麻烦的实现方式 类的继承方式 目录结构如下: auto_client\bin\run.py import sys import os import importlib import request ...
- python基础---输入输出
1.输入字符串. name=input() or name=input('please input a string') 这样可以接收一个字符串,包括空格,都可以输入.只有回车不接受,作为结束符, ...
- vijos 1464 积木游戏 DP
描述 积木游戏 SERCOI 最近设计了一种积木游戏.每个游戏者有N块编号依次为1 ,2,…,N的长方体积木.对于每块积木,它的三条不同的边分别称为"a边"."b边&qu ...
- PHP系统编程--01.多进程与多线程
PHP中提供了一个扩展pcntl,可以利用操作系统的fork调用来实现多进程.fork调用后执行的代码将是并行的. PHP官方没有提供多线程的扩展,pecl中有一个pthreads扩展提供了多线程的特 ...
- 【BZOJ】1726 [Usaco2006 Nov]Roadblocks第二短路
[算法]最短路(spfa) 次短路 [题解] 正反跑两次SPFA,然后枚举每一条边,如果起点到一个端点的最短路+另一个端点到终点的最短路+长度 ≠ 最短路,则和答案比较,保存最小值. #include ...
- php trait 变量类型为数组时 不能被父类子类同时use
直接上代码 --------------------------- trait T1 { public static $a=1; public static $b= []; public static ...
- Html5学习2(Html表格、Html列表、Html5新元素、Canvas (坐标、路径、画圆、文本、渐变、图像))
Html表格 1.表格中的表头:<th></th>.其中表头部分字体加粗,颜色深绿色 <h4>水平标题:</h4> <table border=& ...