C++实现二叉树之二叉链表
来源:互联网 发布:数控编程的方法 编辑:程序博客网 时间:2024/06/05 09:58
#include "stdafx.h"#include <iostream>#include <deque>using namespace std;template<typename T>struct TreeNode{T data; //结点中的元素TreeNode<T> *Lchild, *Rchild; //结点的左、右孩子结点指针//可选择参数的默认构造函数//TreeNode<T>(T nodeValue, TreeNode<T> *rightNode = NULL, TreeNode<T> * leftNode = NULL) : data(nodeValue), Rchild(rightNode), Lchild(leftNode){}};template<typename T>class BinaryTree{public://BinaryTree(){ }BinaryTree(){ root = CreatBT(root); } //初始化一颗二叉树,root指向根结点~BinaryTree(){ Destory(root); }TreeNode<T>* CreatBT(TreeNode<T> *rt); //创建二叉树TreeNode<T>* GetRoot(){ return root; }; //取指向二叉树根结点的指针void PreOrder(TreeNode<T> *rt); //前序遍历void MidOrder(TreeNode<T> *rt); //中序遍历void PostOrder(TreeNode<T> *rt); //后序遍历void LevelOrder(); //层序遍历void Destory(TreeNode<T> *rt); //销毁二叉树int Num_Node(TreeNode<T> *rt); //统计二叉树结点数int Depth(TreeNode<T> *rt); //二叉树深度private:TreeNode<T> *root; //指向根结点的头指针,需要通过公共成员函数来调用};template<typename T>TreeNode<T>* BinaryTree<T>::CreatBT(TreeNode<T> *rt){ //构造二叉树,参数是一个指向结点的指针T nodeValue;cout << "输入结点值:";cin >> nodeValue;if (nodeValue == -1)rt = NULL;else{rt = new TreeNode <T>; //创建一个树结点rt->data = nodeValue;rt->Lchild = CreatBT(rt->Lchild); //递归构造左子树rt->Rchild = CreatBT(rt->Rchild); //递归构造右子树}return rt;}template<typename T>void BinaryTree<T>::PreOrder(TreeNode<T> *rt){ //前序遍历TreeNode<T> *p = rt; if (p == NULL)return;else{cout << p->data << " "; //访问根结点p的数据域PreOrder(p->Lchild); //前序递归遍历p的左子树PreOrder(p->Rchild); //前序递归遍历p的右子树}}template<typename T>void BinaryTree<T>::MidOrder(TreeNode<T> *rt){TreeNode<T> *p = rt;if (p == NULL)return;else{MidOrder(p->Lchild); //中序递归遍历p的左子树cout << p->data << " "; //访问根结点p的数据域MidOrder(p->Rchild); //中序递归遍历p的右子树}}template<typename T>void BinaryTree<T>::PostOrder(TreeNode<T> *rt){TreeNode<T> *p = rt;if (p == NULL)return;else{PostOrder(p->Lchild); //后序递归遍历p的左子树PostOrder(p->Rchild); //后序递归遍历p的右子树cout << p->data << " "; //访问根结点p的数据域}}template<typename T>void BinaryTree<T>::LevelOrder(){ //层序遍历,借助一个deque容器if (root == NULL)return;deque<TreeNode<T>* > que;que.push_back(root); //队尾入队while (que.size()>0){TreeNode<T>* p = que.front(); //取队首元素cout << p->data << " ";que.pop_front(); //删除队首元素,返回voidif (p->Lchild != NULL) //判读该队首元素是否存在左右孩子结点,que.push_back(p->Lchild); if (p->Rchild != NULL)que.push_back(p->Rchild);}}template<typename T>void BinaryTree<T>::Destory(TreeNode<T> *rt){ //销毁二叉树if (rt != NULL){Destory(rt->Lchild); //销毁rt的左子树Destory(rt->Rchild); //销毁rt的右子树delete rt; //销毁rt结点cout << "已销毁!" << endl;}}template<typename T>int BinaryTree<T>::Num_Node(TreeNode<T> *rt){if (rt == NULL)return 0;else{return (1 + Num_Node(rt->Lchild) + Num_Node(rt->Rchild));}}template<typename T>int BinaryTree<T>::Depth(TreeNode<T> *rt){if (rt == NULL)return 0;int h_left = Depth(rt->Lchild);int h_right = Depth(rt->Rchild);if (h_left > h_right)return (h_left + 1);elsereturn (h_right + 1);}int _tmain(int argc, _TCHAR* argv[]){BinaryTree<int> A; //A初始化为空二叉树TreeNode<int> *rootNode = A.GetRoot(); //取指向二叉树根结点的指针cout << "前序遍历:";A.PreOrder(rootNode); cout << endl;cout << "中序遍历:";A.MidOrder(rootNode);cout << endl;cout << "后序遍历:";A.PostOrder(rootNode);cout << endl;cout << "层序遍历:";A.LevelOrder();cout << endl;cout << "二叉树结点个数:" << A.Num_Node(rootNode) << endl;cout << "二叉树的深度:" << A.Depth(rootNode) << endl;return 0;}
0 0
- 数据结构之---C语言实现二叉树的二叉链表存储表示
- C语言二叉树之二叉链表
- 二叉树应用之哈夫曼编码(二叉链表实现)
- C++实现二叉树之二叉链表
- 二叉树之二叉链表的类模板实现
- 数据结构之---二叉树C实现
- 二叉树(二叉链表实现)
- 二叉树的二叉链表实现
- 二叉树的二叉链表实现
- 二叉链表实现二叉树
- 二叉树 c实现
- 二叉树 C实现
- 二叉树 c 实现
- 二叉树之二叉链表
- 二叉树之二叉链表
- 二叉树之实现排序二叉树
- 数据结构之---C语言实现二叉树的三叉链表存储表示
- 剑指offer刷题之c实现的二叉搜索树转换成双向链表
- C#与C/C++的交互
- 大数据平台架构及数据分析平台架构
- linux link script symbol export to C
- 在8X12平台添加或者移植一个完整的camera
- 散列表的详细剖析 (算法导论第11章)
- C++实现二叉树之二叉链表
- ]CUDA学习笔记2
- Android中Service(服务)详解
- AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别
- linux下安装nginx
- 软件开发过程学习笔记(四)之详细设计说明书模板
- linux下安装gsoap
- Android 出现的小问题 an internal error occurred during:”check Android SDk“
- PCA算法学习_2(PCA理论的matlab实现)