C++实现二叉树之二叉链表

原创 2015年07月08日 14:45:48
#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();                       //删除队首元素,返回void
		if (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);
	else
		return (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;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

使用C++链表来实现二叉树的存储和基本操作

1、创建Node.h 定义链表的节点 #ifndef NODE_H #define NODE_H class Node{ public: Node(); Node* searchNo...
  • liuweiyuxiang
  • liuweiyuxiang
  • 2016年10月07日 23:07
  • 1641

二叉树之二叉链表的类模板实现

该类模板实现了一个二叉树的模板类,采用二叉链表实现。 定义二叉树节点类,采用二叉链表实现。 [cpp] view plaincopyprint? ...
  • han____shuai
  • han____shuai
  • 2015年08月13日 00:45
  • 1199

二叉树链表C++实现

(1)用递归方法创建二叉链表 (2)用递归算法对二叉树进行先序遍历,中序遍历和后序遍历,并输出遍历结果 (3)对二叉树进行层次遍历,并输出遍历序列 (4)求二叉树的深度并输出 #include /...
  • jiaxiaoye2005
  • jiaxiaoye2005
  • 2013年01月23日 09:53
  • 2308

数据结构之---C语言实现二叉树的二叉链表存储表示

//二叉树的二叉链表存储表示 //杨鑫 #include #include #define max(a, b) a > b ? a : b //自定义ma...
  • u012965373
  • u012965373
  • 2015年06月13日 21:28
  • 5564

c语言实现二叉树的基本操作--二叉链表存储

利用二叉链表存储,并且利用递归的方法实现二叉树的遍历(前序遍历、中序遍历和后续遍历)操作。 c语言具体实现代码如下: #include #include #include typedef int...
  • zhoufen12345
  • zhoufen12345
  • 2017年03月26日 18:36
  • 2567

数据结构之二叉树链表

2.二叉树      二叉树是n个结点的有限集合,该集合或者为空集(称为空二叉树),或者有一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树的二叉树组成      特点:          ...
  • followMyInclinations
  • followMyInclinations
  • 2015年10月22日 13:08
  • 2086

数据结构学习:利用链表建立二叉树

利用链表保存二叉树
  • He11o_Liu
  • He11o_Liu
  • 2015年09月21日 21:18
  • 2503

用二叉链表存储结构构造一棵二叉树,然后用栈结构进行非递归遍历

二叉树的存储结构包括顺序存储和二叉链表存储结构,其遍历的方式分为递归遍历和非递归遍历,本文章使用二叉链表构建一棵二叉树,然后使用栈这种数据结构实现二叉树的中序非递归遍历。...
  • u011456016
  • u011456016
  • 2015年12月09日 14:30
  • 1536

C++实现二叉树链表

C++实现二叉树链表Node.h#ifndef NODE_H #define NODE_H #include using namespace std;class Node { public: ...
  • master5512
  • master5512
  • 2017年02月09日 00:17
  • 626

二叉树的C++模板类头文件源代码实现

顺序存储的二叉树结构利用数组给满二叉树进行编号,而实际情况中的二叉树不满足满二叉树和完全二叉树,因此会导致内存空间的浪费,所以本文采用链表的存储方式,定义树节点结构体,包含数据和两个左右儿子指针。类的...
  • Alex123980
  • Alex123980
  • 2016年06月01日 17:14
  • 1887
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++实现二叉树之二叉链表
举报原因:
原因补充:

(最多只允许输入30个字)