//指针的二叉查找树

//插入比较简单所以就没做了

//删除太麻烦等有空再做

#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); }

简单的指针二叉查找树和数组二叉查找树相关推荐

  1. 一看就懂的二叉查找树和平衡二叉查找树

    二叉查找树是一种特殊的二叉树,它可以组织动态数据集合,可以支持数据的快速插入,删除和查找操作.之前我们讨论过哈希表,他的,查找,插如和删除的时间复杂度是O(1),既然哈希表这么高效,那么为什么还需要二 ...

  2. C指针4:数组指针(指向数组的指针)

    先明确两个概念:(1和2是两个完全不一样的东西) 1.数组指针:如果一个指针指向了数组(该数组就是普通定义的数组),我们就称它为数组指针(Array Pointer).(1强调的是指针) 2.指针数组 ...

  3. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

  4. 【二叉查找树BST】二叉查找树的基本操作总结

    二叉树就是一棵顺序树,优化查找效率.一组相同的数据所构造出来的二叉查找树不同. 二叉查找树的查找:(一个函数) struct Node{int data;Node* lchild,rchild; }; ...

  5. printf 指针地址_数组指针和指针数组

    首先,理解一下数组指针和指针数组这两个名词: 数组的指针:是一个指针,什么样的指针呢?指向数组的指针. 指针的数组:是一个数组,什么样的数组呢?装着指针的数组. 然后,需要明确一个优先级顺序:()&g ...

  6. java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用

    java/03/类与对象,深入分析类与对象(权限修饰,构造方法和简单java类),数组的定义及使用 七十年代,IBM的Smalltalk语言最先推广面向对象,后来C语言变为C++,后来C++又产生了J ...

  7. C语言 指针+二维数组详解 (应付期末、考研的最强笔记,建议收藏)

    哈喽!这里是一只派大鑫,不是派大星.本着基础不牢,地动山摇的学习态度,从基础的C语言语法讲到算法再到更高级的语法及框架的学习.更好地让同样热爱编程(或是应付期末考试 狗头.jpg)的大家能够在学习阶段 ...

  8. C ++ 指针 | 指针与三维数组_6

    指针与三维数组 1. 三维数组,有些朋友会很少接触,这里上码,看看三维数组是怎么样的: #include<iostream>int main() {int C[3][2][2] = {{{ ...

  9. C语言数组指针(指向数组的指针)详解

    数组(Array)是一系列具有相同类型的数据的集合,每一份数据叫做一个数组元素(Element).数组中的所有元素在内存中是连续排列的,整个数组占用的是一块内存.以int arr[] = { 99, ...

最新文章

  1. 两平面平行方向向量关系_立体几何平行证明的四大必杀绝技------赞!很赞!!非常赞!!!...
  2. where is application controller bound to application main view
  3. WPF 如何将IconFont图标转成Geometry
  4. Android画板控件,可以写字,签名,画画并生成图片
  5. 逐行读文件_用python比较两个文件的内容是否相同
  6. ADSL、SRA、HDSL
  7. python展示全部好友_利用Python网络爬虫抓取微信好友的签名及其可视化展示
  8. DELL服务器装机网络问题
  9. Java 求100以内的质数(素数)
  10. ArcGIS Server 10.8.1安装
  11. 好好学习,天天向上------融会贯通
  12. 音视频卡顿问题的原因及解决方案
  13. 【学习日志】2022.08.26 C#单例模式 Tostring Utils
  14. css3 字体自动换行第二行缩进一格
  15. 2019构建餐饮私域流量池,餐饮商家别错过了这个风口,私域流量攻略完整方案!...
  16. centos8之U盘安装操作系统
  17. css 实现 图片左右滑动查看的效果
  18. java aud 转mp3_‎App Store 上的“音频提取器 - mp3音频转换器,音视频转换”
  19. Windows系统文件快捷链接(软链接/硬链接/符号链接)mklink
  20. 计算机网络学习心得1

热门文章

  1. 一文帮你分析外贸收款难问题
  2. Castor学习笔记(一)
  3. 会议记录怎样做得又快又好?一分钟学会录音转文字
  4. LED阵列PCB灯板绘制
  5. INSERT DESC UPDATE SELECT
  6. c++ Macros
  7. Swiper图片垂直滑动
  8. __construct 与 __destruct 区别
  9. 固本培元之一:栈和堆
  10. html中正确给table加边框