数据结构--二叉序树
来源:互联网 发布:全国最大数据库 编辑:程序博客网 时间:2024/05/01 04:51
<pre name="code" class="cpp">// Binary Sort Tree.cpp : Defines the entry point for the console application./*-----CODE FOR FUN----------------------CREATED BY Dream_Whui-------------2015-3-5-------------------------*/ //二叉排序树#include "stdafx.h"#include <iostream>using namespace std;#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define INFEASIBLE -1#define EQ(a,b) (a == b)#define LT(a,b) (a < b)#define LQ(a,b) (a > b)typedef char KeyType;struct ElemType{ KeyType name; int key;};typedef struct BiTNode //定义二叉树的结构 { ElemType data; //数据域 struct BiTNode *lchild,*rchild;//左子树,右子树 }BiTNode,*BiTree;int InitBiTree(BiTree &T) { T = NULL; return OK;}void DestroyBiTree(BiTree &T) { if(T) { if(T->lchild) DestroyBiTree(T->lchild); if(T->rchild) DestroyBiTree(T->rchild); free(T); T=NULL; }}int BiTreeEmpty(BiTree T){ if(T) return FALSE; else return TRUE;}BiTree SearchBST(BiTree T, int key)//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素{ //若查找成功,则返回指向该数据元素结点的指针,否则返回空指针 if( (!T) || EQ(T->data.key , key) )//查找结束 return T; else { if( LT(T->data.key , key) ) //在右子树中继续查找 SearchBST(T->rchild , key); else SearchBST(T->lchild , key); //在左子树中继续查找 }}int SearchBST(BiTree T, int key, BiTree f, BiTree &p)//在根指针T所指二叉序树中递归地查找其关键字等于key的数据元素{ //若查找成功,则指针p指向该数据元素结点,并返回TRUE,否则返回p指向查找路径上访问的 if(!T) //查找不成功 //最后一个结点并返回FALSE,指针f指向T的双亲,初始值为NULL { p = f; return FALSE; } else if(EQ(key , T->data.key))//查找成功 { p = T; return TRUE; } else if(LT(key , T->data.key))//在左子树中继续查找 { return SearchBST(T->lchild, key, T, p); } else return SearchBST(T->rchild, key, T, p);//在右子树中继续查找}int InsertBST(BiTree &T, ElemType e)//当二叉序树T中不存在关键字等于e.key的数据元素时,插入e返回TRUE{ //否则返回FALSE BiTree p; if(!SearchBST(T,e.key,NULL,p)) //查找不成功 { BiTree s = (BiTree)malloc(sizeof(BiTNode)); s->data = e; s->lchild = s->rchild = NULL; if(!p) //被插结点*s为新的根结点 T = s; else if(LT(e.key, p->data.key)) //被插结点*s为左孩子 p->lchild = s; else p->rchild = s; //被插结点*s为右孩子 return TRUE; } else return FALSE; //树中已有相同结点,不再插入}int Delete(BiTree &p) //从二叉序树中删除几点p,并重接它的左或右子树{ BiTree q, s; if(!p->lchild) //左子树空,只需重接它的右子树 { q = p; p = p->rchild; free(q); } else if(!p->rchild) //右子树空,只需重接它的左子树 { q = p; p = p->lchild; free(q); } else //左右子树均不空 { q = p; s = p->lchild; while(s->rchild) { q = s; s = s->rchild; } //s指向被删结点的“前驱” p->data = s->data; if(q != p) q->rchild = s->lchild; else q->lchild = s->lchild; free(s); } return TRUE;}int DeleteBSF(BiTree &T, int key){ if(!T) return FALSE; else { if(EQ(key, T->data.key)) return Delete(T); else if(LT(key, T->data.key)) DeleteBSF(T->lchild,key); else DeleteBSF(T->rchild,key); }}void Visit(ElemType e){ cout<<e.key<<" ";}void InOrderTraverse(BiTree T, void(*Visit)(ElemType)) //中序遍历{ if(T) { InOrderTraverse(T->lchild,Visit); Visit(T->data); InOrderTraverse(T->rchild,Visit); }}int _tmain(int argc, _TCHAR* argv[]){ BiTree T; InitBiTree(T); ElemType R[10]={{'A',45},{'B',12},{'C',53},{'D',3},{'E',37},{'F',100},{'H',24},{'I',61},{'J',90},{'K',78}}; for(int i=0; i<10; i++) InsertBST(T,R[i]); InOrderTraverse(T,Visit); BiTree temp = SearchBST(T,12); if(temp) cout<<temp->data.name<<endl; DeleteBSF(T,12); InOrderTraverse(T,Visit); return 0;}
0 0
- 数据结构--二叉序树
- 【数据结构】二叉树,以前序序列输入
- 数据结构练习题---先序遍历二叉树
- 数据结构练习题---后序遍历二叉树
- 数据结构练习题---先序遍历二叉树
- 数据结构:中序线索二叉树
- 数据结构二叉树遍历之中序遍历
- 【数据结构】层序生成二叉树
- 【数据结构】二叉树的中序遍历
- 【数据结构】二叉树的先序遍历
- 【数据结构】二叉树的后序遍历
- 【数据结构】层序遍历二叉树
- 数据结构 二叉树的层序遍历
- 数据结构练习题---先序遍历二叉树
- 数据结构-树-二叉树
- 数据结构::树,二叉树
- 数据结构-二叉树
- 二叉树的数据结构
- 基于xmpp openfire smack 开发(四)单聊
- 01-复杂度2.Maximum Subsequence Sum
- 1012. The Best Rank (25)暴力枚举 排序
- 【HBase基础教程】1、HBase之单机模式与伪分布式模式安装
- nfs:server is not responding,still trying 原因与解决方案
- 数据结构--二叉序树
- emacs配置文件路径
- 大数据博客
- Majority Element
- 从github下载项目到本地
- opencv移植到arm的出现的问题
- Factorial Trailing Zeroes
- Android 快速开发--万能的Adapter
- Android onTouch 与 onClick 的关系