树之二叉树 图解和代码实现
2013-03-12 16:56
489 查看
树之二叉树
图解:
![](http://img.my.csdn.net/uploads/201303/12/1363078906_7664.jpg)
以下是代码实现:
bitree.h
bitree.cpp
图解:
![](http://img.my.csdn.net/uploads/201303/12/1363078906_7664.jpg)
以下是代码实现:
bitree.h
//声明类BiTree及定义结构BiNode,文件名为bitree.h #ifndef BITREE_H #define BITREE_H template <class T> struct BiNode //二叉树的结点结构 { T data; BiNode<T> *lchild, *rchild; }; template <class T> class BiTree { public: BiTree( ); //构造函数,初始化一棵二叉树,其前序序列由键盘输入 ~BiTree(void); //析构函数,释放二叉链表中各结点的存储空间 BiNode<T>* Getroot(); //获得指向根结点的指针 void PreOrder(BiNode<T> *root); //前序遍历二叉树 void InOrder(BiNode<T> *root); //中序遍历二叉树 void PostOrder(BiNode<T> *root); //后序遍历二叉树 void LeverOrder(BiNode<T> *root); //层序遍历二叉树 private: BiNode<T> *root; //指向根结点的头指针 BiNode<T> *Creat( ); //有参构造函数调用 void Release(BiNode<T> *root); //析构函数调用 }; #endif
bitree.cpp
//定义类中的成员函数,文件名为bitree.cpp #include<iostream> #include<string> #include"bitree.h" using namespace std; /* *前置条件:二叉树不存在 *输 入:无 *功 能:构造一棵二叉树 *输 出:无 *后置条件:产生一棵二叉树 */ template<class T> BiTree<T>::BiTree( ) { this->root = Creat( ); } /* *前置条件:二叉树已存在 *输 入:无 *功 能:释放二叉链表中各结点的存储空间 *输 出:无 *后置条件:二叉树不存在 */ template<class T> BiTree<T>::~BiTree(void) { Release(root); } /* *前置条件:二叉树已存在 *输 入:无 *功 能:获取指向二叉树根结点的指针 *输 出:指向二叉树根结点的指针 *后置条件:二叉树不变 */ template<class T> BiNode<T>* BiTree<T>::Getroot( ) { return root; } /* *前置条件:二叉树已存在 *输 入:无 *功 能:前序遍历二叉树 *输 出:二叉树中结点的一个线性排列 *后置条件:二叉树不变 */ template<class T> void BiTree<T>::PreOrder(BiNode<T> *root) { if(root==NULL) return; else{ cout<<root->data<<" "; PreOrder(root->lchild); PreOrder(root->rchild); } } /* *前置条件:二叉树已存在 *输 入:无 *功 能:中序遍历二叉树 *输 出:二叉树中结点的一个线性排列 *后置条件:二叉树不变 */ template <class T> void BiTree<T>::InOrder (BiNode<T> *root) { if (root==NULL) return; //递归调用的结束条件 else{ InOrder(root->lchild); //中序递归遍历root的左子树 cout<<root->data<<" "; //访问根结点的数据域 InOrder(root->rchild); //中序递归遍历root的右子树 } } /* *前置条件:二叉树已存在 *输 入:无 *功 能:后序遍历二叉树 *输 出:二叉树中结点的一个线性排列 *后置条件:二叉树不变 */ template <class T> void BiTree<T>::PostOrder(BiNode<T> *root) { if (root==NULL) return; //递归调用的结束条件 else{ PostOrder(root->lchild); //后序递归遍历root的左子树 PostOrder(root->rchild); //后序递归遍历root的右子树 cout<<root->data<<" "; //访问根结点的数据域 } } /* *前置条件:二叉树已存在 *输 入:无 *功 能:层序遍历二叉树 *输 出:二叉树中结点的一个线性排列 *后置条件:二叉树不变 */ template <class T> void BiTree<T>::LeverOrder(BiNode<T> *root) { const int MaxSize = 100; int front = 0; int rear = 0; //采用顺序队列,并假定不会发生上溢 BiNode<T>* Q[MaxSize]; BiNode<T>* q; if (root==NULL) return; else{ Q[rear++] = root; while (front != rear) { q = Q[front++]; cout<<q->data<<" "; if (q->lchild != NULL) Q[rear++] = q->lchild; if (q->rchild != NULL) Q[rear++] = q->rchild; } } } /* *前置条件:空二叉树 *输 入:数据ch; *功 能:初始化一棵二叉树,构造函数调用 *输 出:无 *后置条件:产生一棵二叉树 */ template <class T> BiNode<T>* BiTree<T>::Creat( ) { BiNode<T>* root; T ch; cout<<"请输入创建一棵二叉树的结点数据"<<endl; cin>>ch; if (ch=="#") root = NULL; else{ root = new BiNode<T>; //生成一个结点 root->data=ch; root->lchild = Creat( ); //递归建立左子树 root->rchild = Creat( ); //递归建立右子树 } return root; } /* *前置条件:二叉树已经存在 *输 入:无 *功 能:释放二叉树的存储空间,析构函数调用 *输 出:无 *后置条件:二叉树不存在 */ template<class T> void BiTree<T>::Release(BiNode<T>* root) { if (root != NULL){ Release(root->lchild); //释放左子树 Release(root->rchild); //释放右子树 delete root; } }
相关文章推荐
- 队列的链接存储结构——链队列 图解和代码实现
- 树之二叉树 图解和代码实现
- 队列的链接存储结构——链队列 图解和代码实现
- 排序算法原理、图解、代码实现
- 查找技术之线性表 图解和代码实现
- Linux:RSync实现文件备份同步图解及代码
- 图解二叉树的三种遍历方式及java实现代码
- 队列的顺序存储结构——循环队列 图解和代码实现
- 排序技术_各种算法原理 图解 代码实现
- IO流_递归求阶乘的代码实现及内存图解
- 算法 -- Java实现选择排序(图解 + 代码实现)
- 二叉堆建堆的优化算法原理图解及代码实现
- 排序技术_各种算法原理 图解 代码实现
- 排序算法——希尔排序的图解、代码实现以及时间复杂度分析
- 链表数据结构图解 和 代码实现
- js中放大器的图解及实现代码
- Java实现冒泡排序(图解 + 代码实现)
- 排序技术_各种算法原理 图解 代码实现
- 线性表之单链表 图解和代码实现
- 线性表之顺序表 图解和代码实现