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.斐波那契 ...
随机推荐
- 常见的shell命令总结
1.查看一个程序是否运行 ps –ef|grep tomcat 查看所有有关tomcat的进程 2.终止线程 kill -9 2222 3.查看文件,包含隐藏文件 ls -al 4.当前 ...
- PHP检测json格式数据
首先要记住json_encode返回的是字符串, 而json_decode返回的是对象 判断数据不是JSON格式: 复制代码代码如下: function is_not_json($str){ ...
- ucenter搭建
使用xftp传到虚拟机.解压[root@ygy130 ~]# unzip -o -d ./Ucenter_1.6 UCenter_1.6.0_SC_UTF8.zip [root@ygy130 ~]# ...
- Codeforces Round #508 (Div. 2) D. Slime
D. Slime 题目链接:https://codeforces.com/contest/1038/problem/D 题意: 给出两个数,然后每次可以对相邻的两个数合并,比如x,y,那么合并过后就是 ...
- POJ3468:A Simple Problem with Integers(线段树模板)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 149972 ...
- [zabbix]zabbix2.0apt源安装
http://www.sysadminworld.com/2013/install-zabbix-2-on-ubuntu-12-04-precise/
- 照片EXIF信息的读取和改写的JAVA实现
由于项目需要对照片的EXIF信息进行处理,因此在网上搜索了一番.捣鼓出来了,写下,总结. 需要用到2个jar包,metadata-extractor-2.3.1和mediautil-1.0.这2个ja ...
- [洛谷P3628] [APIO2010]特别行动队
洛谷题目链接:[APIO2010]特别行动队 题目描述 你有一支由 n 名预备役士兵组成的部队,士兵从 1 到 \(n\) 编号,要将他们拆分 成若干特别行动队调入战场.出于默契的考虑,同一支特别行动 ...
- django自带分页代码
django分页 {% if is_paginated %} <div class="pagination-simple"> <!-- 如果当前页还有上一页,显示 ...
- 招人不是HR第一职责,留住人才是
什么是HR的第一责任?我希望你们知道,招人不是你的第一职责,留住人才是你的第一职责.HR工作是相当难做的,你们是公司集团内里各个部门中最难做的部门,也是最具战略性的部门. 以人为本,这个“人”就是阿里 ...