博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据结构之二叉排序树数组,链表实现
阅读量:7058 次
发布时间:2019-06-28

本文共 4916 字,大约阅读时间需要 16 分钟。

1 链表

#include 
#include
typedef struct node {
int data; struct node * lchild; struct node * rchild; }node; void Init(node *t) {
t = NULL; } node * Insert(node *t , int key) {
if(t == NULL) {
node * p; p = (node *)malloc(sizeof(node)); p->data = key; p->lchild = NULL; p->rchild = NULL; t = p; } else {
if(key < t->data) t->lchild = Insert(t->lchild, key); else t->rchild = Insert(t->rchild, key); } return t; //important! } node * creat(node *t) {
int i, n, key; scanf("%d", &n); for(i = 0; i < n; i++) {
scanf("%d", &key); t = Insert(t, key); } return t; } void InOrder(node * t) //中序遍历输出 {
if(t != NULL) {
InOrder(t->lchild); printf("%d ", t->data); InOrder(t->rchild); } } int main() {
node * t = NULL; t = creat(t); InOrder(t); return 0; }

  

2 数组

#include 
#include
#define N 1000 int l[N], r[N], key[N], flag, root; void insert(int index, int x) {
if(x <= key[index]) {
if(l[index] == -1) l[index] = flag; else insert(l[index], x); } else {
if(r[index] == -1) r[index] = flag; else insert(r[index], x); } } void InOrder(int index) {
if(l[index] != -1) InOrder(l[index]); printf("%d ", key[index]); if(r[index] != -1) InOrder(r[index]); } int main() {
int i, x, n; memset(l, -1, sizeof(l)); memset(r, -1, sizeof(r)); scanf("%d", &n); root = -1; flag = 0; for(i = 0; i < n; i++) {
scanf("%d", &x); if(root == -1) key[++root] = x; else {
key[++flag] = x; insert(root, x); } } InOrder(root); return 0; }

  二叉排序树的删除操作

有3种方式:

#include 
#include
#include
using namespace::std; typedef struct node {
int data; struct node * lchild; struct node * rchild; }node; void Init(node *t) {
t = NULL; } node * Insert(node *t , int key) {
if(t == NULL) {
node * p; p = (node *)malloc(sizeof(node)); p->data = key; p->lchild = NULL; p->rchild = NULL; t = p; } else {
if(key < t->data) t->lchild = Insert(t->lchild, key); else t->rchild = Insert(t->rchild, key); } return t; //important! } node * creat(node *t) {
int i, n, key; scanf("%d", &n); for(i = 0; i < n; i++) {
scanf("%d", &key); t = Insert(t, key); } return t; } void InOrder(node * t) //中序遍历输出 {
if(t != NULL) {
InOrder(t->lchild); printf("%d ", t->data); InOrder(t->rchild); } } //1.完成节点的删除操作 node * deleteNode1(node *t) {
//如果t有左子树 if(t->lchild) {
node *r = t->lchild; node *prer = t->lchild; //找到其左子树中最有的节点 while(r->rchild != NULL) {
prer = r; r = r->rchild; } //如果r不是t的左孩子 //将r的左孩子作为r的父亲节点prer的右孩子 if(prer != r) {
prer->rchild = r->lchild; //被删除节点t的做子树做为r的右子树 r->lchild = t->lchild; } ////被删结点t的右子树作为r的右子树 r->rchild = t->rchild; free(t); return r; } //若t没有左子树,直接用t的右孩子取代它 else {
node *q = t->rchild; free(t); return q; } } //2.完成节点的删除操作 node * deleteNode2(node *t) {
if(t->lchild) {
node *r = t->lchild; while(r->rchild != NULL) {
r = r->rchild; } r->rchild = t->rchild; node *q = t->lchild; free(t); return q; } else {
node *q = t->rchild; free(t); return q; } } //3.1.完成节点的删除操作 //基本上与第一种情况类似,之不过这次不进行节点指针的移动,而是删 //除“值” node *deleteNode3(node *t) {
//如果t有左子树 if(t->lchild) {
node *r = t->lchild; node *prer = t->lchild; //找到其左子树中最有的节点 while(r->rchild != NULL) {
prer = r; r = r->rchild; } t->data = r->data; if(prer != r) {
prer->rchild = r->lchild; } else {
t->lchild = r->lchild; } free(r); return t; } //若t没有左子树,直接用t的右孩子取代它 else {
node *q = t->rchild; free(t); return q; } } //递归操作,寻找x的合适位置,主要是调用deleteNode()函数 node * Delete(node *t,int x) {
if(t) {
if(t->data == x) //t = deleteNode1(t); //t = deleteNode2(t); t = deleteNode3(t); else if(t->data > x) t->lchild = Delete(t->lchild,x); else t->rchild = Delete(t->rchild,x); } return t; } int main() {
node * t = NULL; t = creat(t); InOrder(t); cout << endl; cout << "要删除的节点是:" << endl; int k; cin >> k ; Delete(t,k); InOrder(t); return 0; }

  

参考:

转载地址:http://jeyll.baihongyu.com/

你可能感兴趣的文章
日立数据任命四大高管四处挖人拓展存储市场
查看>>
用历史应对威胁情报数据过载挑战
查看>>
《R语言游戏数据分析与挖掘》一2.3 数据导入
查看>>
大数据推动、可持续运营 宁家骏谈新型智慧城市建设路径
查看>>
《算法技术手册》一2.3.1 最坏情况
查看>>
XTools CRM:从粗放大数据中提炼精确厚数据
查看>>
专业医疗仪器设备走入千家万户 安全引担忧
查看>>
不常见但是很有用的gcc命令行选项(二)
查看>>
闪存趋势可能导致用户回归硬盘
查看>>
未来物联网影响商业的三种表现
查看>>
降低大数据合规风险的三个要点
查看>>
100G及超100G数据中心光模块的技术选择
查看>>
如何整理磁盘碎片让Windows 7电脑运行更快?
查看>>
智能投影的“淘金热”
查看>>
智能终端不装未成年人保护软件 厂商或面临高额罚款
查看>>
Java Web模板代码生成器的设计与实现
查看>>
红杉入股LIFX,智能你个灯泡
查看>>
微信小程序架构分析 (下)
查看>>
红帽Chris:软件定义带动开源存储发展
查看>>
如何设计未来的数据中心
查看>>