简单的指针二叉查找树和数组二叉查找树
//指针的二叉查找树
//插入比较简单所以就没做了
//删除太麻烦等有空再做
#include<iostream> using namespace std; template<typename Elem> class BiNode { public: BiNode(const Elem&, BiNode* pL = NULL, BiNode* pR = NULL); bool IsLeaf(){ return m_pLeft==NULL && m_pRight==NULL; } public: Elem m_Data; BiNode* m_pLeft; BiNode* m_pRight; }; //节点的构造函数 template<typename Elem> BiNode<Elem>::BiNode( const Elem& item, BiNode* pL = NULL, BiNode* pR = NULL)//① { m_Data = item; m_pLeft = pL; m_pRight = pR; } /// /// 二叉树 声明 /// /// template<typename Elem> class BiTree { public: BiTree(); void InitTree(); BiNode<Elem>* AddNode( BiNode<Elem> *root, const Elem&); void PreTraverse( const BiNode<Elem>*); const BiNode<Elem>* GetRoot(){ return m_pRoot; } private: BiNode<Elem>* m_pRoot; int m_NodeCount; int m_Depth; }; //二叉树构造函数 template<typename Elem> BiTree<Elem>::BiTree():m_NodeCount(0), m_Depth(0) { } //二叉树几点插入 template<typename Elem> BiNode<Elem>* BiTree<Elem>::AddNode( BiNode<Elem>* root, const Elem& item)//对比①究竟何时需要在模板参数中添加<> { if( root->m_Data == item )//元素相同即返回NULL return NULL; if( root->m_Data > item ) { if( root->m_pLeft != NULL ) AddNode( root->m_pLeft, item ); else { root->m_pLeft = new BiNode<Elem>( item ); return root->m_pLeft; } } else { if( root->m_pRight != NULL ) AddNode( root->m_pRight, item ); else { root->m_pRight = new BiNode<Elem>(item); return root->m_pRight; } } } template<typename Elem> void BiTree<Elem>::InitTree() { Elem item; cin>>item; m_pRoot = new BiNode<Elem>(item); m_NodeCount++; while(cin>>item&&item != '/n') { if( AddNode(m_pRoot, item)!= NULL) m_NodeCount++; } } //前周游 template<typename Elem> void BiTree<Elem>::PreTraverse( const BiNode<Elem>* root) { if( root == NULL) return; cout<<"当前元素值为"<<root->m_Data<<endl; PreTraverse( root->m_pLeft); PreTraverse( root->m_pRight ); } int main() { BiTree<int> bt; bt.InitTree(); bt.PreTraverse( bt.GetRoot()); return 0; }
//这是基于数组的二叉查找树
#include<iostream> using std::cin; using std::cout; using std::endl; template<typename Elem> class BST { public: BST(int n = 30); void BuildTree(); int AddNode(const int subroot, const Elem&); void PreOrder( const int subroot); private: Elem* m_BST; int m_size; }; template<typename Elem> BST<Elem>::BST( int n = 30): m_size(n) { m_BST = new Elem[m_size]; memset( m_BST, -1, m_size*sizeof(Elem)); } template<typename Elem> int BST<Elem>::AddNode(const int subroot, const Elem& item) { if( m_BST[subroot] > item ) { if(( 2*subroot+1)>= m_size) return m_size;//越界处理 if( m_BST[2*subroot+1] != -1 ) AddNode( 2*subroot+1, item ); else { m_BST[ 2*subroot+1] = item; return (2*subroot+1); } } if( m_BST[subroot] < item ) { if( 2*subroot+2 >= m_size ) return m_size;//越界处理 if( m_BST[2*subroot+2] != -1 ) AddNode( 2*subroot+2, item ); else { m_BST[ 2*subroot+2] = item; return 2*subroot+2; } } return -1; } template<typename Elem> void BST<Elem>::BuildTree() { Elem elem; cin>>elem; m_BST[0] = elem; while(cin>>elem&& elem != -1) { this->AddNode( 0, elem ); } } template<typename Elem> void BST<Elem>::PreOrder( const int subroot) { if( m_BST[subroot] != -1 ) cout<<m_BST[subroot]<<" "; else return; if( 2*subroot+1 <= m_size ) PreOrder(2*subroot+1); if( 2*subroot+2 <= m_size ) PreOrder(2*subroot+2 ); } void main() { BST<int> bst(30); bst.BuildTree(); bst.PreOrder(0); }
简单的指针二叉查找树和数组二叉查找树相关推荐
- 一看就懂的二叉查找树和平衡二叉查找树
二叉查找树是一种特殊的二叉树,它可以组织动态数据集合,可以支持数据的快速插入,删除和查找操作.之前我们讨论过哈希表,他的,查找,插如和删除的时间复杂度是O(1),既然哈希表这么高效,那么为什么还需要二 ...
- C指针4:数组指针(指向数组的指针)
先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...
- 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)
相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...
- 【二叉查找树BST】二叉查找树的基本操作总结
二叉树就是一棵顺序树,优化查找效率.一组相同的数据所构造出来的二叉查找树不同. 二叉查找树的查找:(一个函数) struct Node{int data;Node* lchild,rchild; }; ...
- printf 指针地址_数组指针和指针数组
首先,理解一下数组指针和指针数组这两个名词: 数组的指针:是一个指针,什么样的指针呢?指向数组的指针. 指针的数组:是一个数组,什么样的数组呢?装着指针的数组. 然后,需要明确一个优先级顺序:()&g ...
- java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用
java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用 七十年代,IBM的Smalltalk语言最先推广面向对象,后来C语言变为C++,后来C++又产生了J ...
- C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)
哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...
- C ++ 指针 | 指针与三维数组_6
指针与三维数组 1. 三维数组,有些朋友会很少接触,这里上码,看看三维数组是怎么样的: #include<iostream>int main() {int C[3][2][2] = {{{ ...
- C语言数组指针(指向数组的指针)详解
数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...
最新文章
- 两平面平行方向向量关系_立体几何平行证明的四大必杀绝技------赞!很赞!!非常赞!!!...
- where is application controller bound to application main view
- WPF 如何将IconFont图标转成Geometry
- Android画板控件,可以写字,签名,画画并生成图片
- 逐行读文件_用python比较两个文件的内容是否相同
- ADSL、SRA、HDSL
- python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示
- DELL服务器装机网络问题
- Java 求100以内的质数(素数)
- ArcGIS Server 10.8.1安装
- 好好学习,天天向上------融会贯通
- 音视频卡顿问题的原因及解决方案
- 【学习日志】2022.08.26 C#单例模式 Tostring Utils
- css3 字体自动换行第二行缩进一格
- 2019构建餐饮私域流量池,餐饮商家别错过了这个风口,私域流量攻略完整方案!...
- centos8之U盘安装操作系统
- css 实现 图片左右滑动查看的效果
- java aud 转mp3_App Store 上的“音频提取器 - mp3音频转换器,音视频转换”
- Windows系统文件快捷链接(软链接/硬链接/符号链接)mklink
- 计算机网络学习心得1