c++实现二叉树(递归)

原创 2016年06月01日 19:01:32

首先先来看一下树的结构:


树是n(n>=0)个有限个数据的元素集合,形状像一颗倒过来的树。

spacer.gif

wKiom1ca2l-TwnaSAAARndl5zzk385.png

wKiom1ca2ojBKowqAAA7aWa1ru4005.png

而二叉树就是树的一种特殊结构:

  1. 完全二叉树的数组表示

    wKiom1ca2z2SKQwRAADX9nx7M74621.png

  2. 链表存储表示

wKiom1ca23nw06oKAAFyCnIRqy0989.png

下面我就实现一下二叉链的这种结构:

首先是它的节点的结构:

template <typename T>
struct BinaryTreeNode
{
public:
	BinaryTreeNode(const T &data)//构造函数
		:_left(NULL)
		,_right(NULL)
		,_data(data)
	{}
public:
	BinaryTreeNode<T> * _left;//左子树
	BinaryTreeNode<T> * _right;//右子树
	T _data;//数据项
};

然后是它的基本成员函数:

template <typename T>
class BinaryTree
{
	typedef BinaryTreeNode<T> Node;//重命名struct结构
public:
	BinaryTree()//无参的构造函数
		:_root(NULL)
	{}

	BinaryTree(const T* a, size_t size, const T& invalid)//有参构造函数
		:_root(NULL)
	{
		size_t index = 0;
		_root = _CreatBinaryTree(a, size, invalid, index);
	}

	BinaryTree(const BinaryTree<T> & t)//拷贝构造
		:_root(NULL)
	{
		_root = _Copy(t._root);
	}

	BinaryTree<T>& operator=(BinaryTree<T> t)//赋值运算符的重载
	{
		if (this != &t)//防止自赋值
		{
			swap(_root, t._root);
		}
		return *this;
	}

	~BinaryTree()//析构函数
	{
		if (_root)
		{
			_Delete(_root);
		}
	}

	void PrevOrder()//前序遍历
	{
		_PrevOrder(_root);
		cout << "over"<<endl;
	}

	void InOrder()//中序遍历
	{
		_InOrder(_root);
		cout << "over" << endl;
	}

	void PostOrder()//后序遍历
	{
		_PostOrder(_root);
		cout << "over" << endl;
	}

	void LevelOredr()//层次遍历
	{
		_LevelOrder(_root);
		cout << "over" << endl;
	}

	size_t Size()//节点数
	{
		return _Size(_root);
	}

	size_t Depth()//深度
	{
		return _Depth(_root);
	}

	size_t LeafSize()//叶子节点数
	{
		return _LeafSize(_root);
	}

protected:
	//创建二叉树
	Node* _CreatBinaryTree(const T *a, size_t size, const T& invalid,size_t& index)
	{
		Node * cur = NULL;
		if (index < size&&a[index] != invalid)//不能越界
		{
			cur = new Node(a[index]);//开辟节点
			cur->_left = _CreatBinaryTree(a, size, invalid, ++index);//递归创建左子树
			cur->_right = _CreatBinaryTree(a, size, invalid, ++index);//递归创建右子树
		}
		return cur;
	}
	//复制二叉树
	Node* _Copy(Node * root)
	{
		Node * cur = NULL;
		if (root == NULL)
		{
			return NULL;
		}

		cur = new Node(root->_data);//创建该节点

		cur->_left = _Copy(root->_left);
		cur->_right = _Copy(root->_right);
		return cur;
	}
	//删除
	void _Delete(Node * &root)
	{
		if (root == NULL)
		{
			return;
		}
		if (root->_left == NULL && root->_right == NULL)//该节点没有左右孩子
		{
			delete root;//释放该节点
			root = NULL;
			return;
		}
		_Delete(root->_left);
		_Delete(root->_right);
	}
	//前序遍历:根节点--左子树--右子树
	void _PrevOrder(Node * root)
	{
		if (root == NULL)
		{
			return;
		}

		cout << root->_data << "->";
		_PrevOrder(root->_left);
		_PrevOrder(root->_right);
	}
	//中序遍历:左子树--根节点--右子树
	void _InOrder(Node * root)
	{
		
		if (root == NULL)
		{
			return;
		}
		
		_PrevOrder(root->_left);
		cout << root->_data << "->";
		_PrevOrder(root->_right);
	}
	//后序遍历:左子树--右子树--根节点
	void _PostOrder(Node * root)
	{
		if (root == NULL)
		{
			return;
		}

		_PrevOrder(root->_left);
		_PrevOrder(root->_right);
		cout << root->_data << "->";
	}
	//层次遍历
	void _LevelOrder(Node* root)
	{
		queue<Node*> q;
		if (root == NULL)
		{
			return;
		}
		q.push(root);
		while (!q.empty())
		{
			if (q.front()->_left != NULL)
			{
				q.push(q.front()->_left);
			}
			if (q.front()->_right != NULL)
			{
				q.push(q.front()->_right);
			}
			cout << q.front()->_data << "->";
			q.pop();
		}
	}
	//节点个数
	size_t _Size(Node * root)
	{
		if (root == NULL)
		{
			return 0;
		}
		return _Size(root->_left) + _Size(root->_right) + 1;//当左子树或者右子树不为空时,该节点有数据
	}
	//二叉树的深度
	size_t _Depth(Node * root)
	{
		if (root==NULL)
		{
			return 0;
		}
		size_t leftDepth = _Depth(root->_left);
		size_t rightDepth = _Depth(root->_right);
		/*if (leftDepth >= rightDepth)
		{
			return leftDepth + 1;
		}
		else
			return rightDepth + 1;*/
		return leftDepth > rightDepth?leftDepth + 1 : rightDepth+1;
	}
	//叶子节点个数
	size_t _LeafSize(Node * root)
	{
		size_t size = 0;
		if (root == NULL)
		{
			return size;
		}
		if (root->_left == NULL&&root->_right == NULL)
		{
			size++;
			return size;
		}
		
		return _LeafSize(root->_left)+_LeafSize(root->_right);
	}



private:
	Node * _root;//根节点
};

测试用例以及结果如下:

void Test()
{
	int array1[10] = { 1, 2, 3, '#', '#', 4, '#' , '#', 5, 6 };
	BinaryTree<int> b1(array1, 10, '#');
	cout << "前序遍历:";
	b1.PrevOrder();
	cout << "中序遍历:";
	b1.InOrder();
	cout << "后序遍历:";
	b1.PostOrder();
	cout << "层次遍历:";
	b1.LevelOredr();
	cout << endl;
	cout << "节点数:" << b1.Size() << endl;
	cout << "深度:" << b1.Depth() << endl;
	cout << "叶子节点数:" << b1.LeafSize() << endl;
	cout << endl;

	BinaryTree<int> b2(b1);
	cout << "前序遍历:";
	b2.PrevOrder();
	cout << "中序遍历:";
	b2.InOrder();
	cout << "后序遍历:";
	b2.PostOrder();
	cout << "层次遍历:";
	b2.LevelOredr();
	cout << endl;
	cout << "节点数:" << b2.Size() << endl;
	cout << "深度:" << b2.Depth() << endl;
	cout << "叶子节点数:" << b2.LeafSize() << endl;
	cout << endl;

	BinaryTree<int> b3;
	b3 = b1;
	cout << "前序遍历:";
	b3.PrevOrder();
	cout << "中序遍历:";
	b3.InOrder();
	cout << "后序遍历:";
	b3.PostOrder();
	cout << "层次遍历:";
	b3.LevelOredr();
	cout << endl;
	cout << "节点数:" << b3.Size() << endl;
	cout << "深度:" << b3.Depth() << endl;
	cout << "叶子节点数:" << b3.LeafSize() << endl;

}

wKiom1ca3H7TngvFAAAqMVQuylQ347.png

本文出自 “不断进步的空间” 博客,请务必保留此出处http://10824050.blog.51cto.com/10814050/1766978

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

二叉树C++实现详解(递归)

原文:http://blog.csdn.net/zlhy_/article/details/8872564 二叉树按照数据结构类型来划分属于树结构,在树结构中他又是比较简单而且具有理论研究的意义...
  • xiaoshengqdlg
  • xiaoshengqdlg
  • 2014年01月07日 11:18
  • 1341

C++递归创建、非递归遍历二叉树的基本操作

最近学了二叉树,这个数据结构和它的名字一样,真是二叉。如果单纯的让我想这样的算法,以笔者的脑子想一辈子都想不出来。二叉树刚学完,老师又讲了图。 俗话说,不能在一棵树上吊死,那我选择在二叉树上吊死。关键...
  • wufeifan_learner
  • wufeifan_learner
  • 2017年10月22日 16:22
  • 333

C++实现二叉树的建立和三种递归遍历

二叉树是一种常见的数据结构,二叉树的遍历也是家常便饭的事了,这里仅仅写出一个完整的可以运行的C++代码来随便建立一个如下图所示的二叉树,建一棵二叉树是实现二叉树各种操作的基础,下面的程序也很简单,这只...
  • JXH_123
  • JXH_123
  • 2014年06月30日 20:16
  • 2709

二叉树建立与遍历递归操作c++实现

#include #include #include using namespace std; //二叉树的数据类型 typedef char BiTType; ...
  • lwy313722871
  • lwy313722871
  • 2013年12月14日 00:50
  • 1580

【C++】二叉树的创建方法及其遍历的递归与非递归方法总结

二叉树的创建方法及其遍历的递归与非递归方法总结
  • Chengzi_comm
  • Chengzi_comm
  • 2015年09月15日 11:00
  • 985

二叉树(1)——二叉树的定义和递归实现

定义 最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的树。 递归定义:二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树...
  • luoweifu
  • luoweifu
  • 2013年06月11日 23:27
  • 11658

二叉树的三种遍历方法(递归和非递归)(转载)

#include #include //STL #include using namespace std; class Tree { public: Tree *Left; Tre...
  • acdnjjjdjkdckjj
  • acdnjjjdjkdckjj
  • 2011年03月10日 17:24
  • 4182

二叉树的创建、销毁、各种递归、循环遍历方法(可运行测试)

因为二叉树的定义就是递归的, 所以二叉树、创建、销毁和各种遍历操作都使用递归的方法,会比较好理解。递归其实主要运用到了系统工作栈, 因此可以使用递归实现的,借助用户栈一般也可以实现, 本文中三种遍历方...
  • haoyuedangkong_fei
  • haoyuedangkong_fei
  • 2016年05月25日 14:47
  • 1145

二叉树的链式结构递归遍历实现

二叉树的链式结构递归遍历实现 1.     BinTree.h文件 #ifndef__BINTREE_H__ #define__BINTREE_H__ #include #include ...
  • qq_20083641
  • qq_20083641
  • 2016年10月19日 09:56
  • 351

广义表法建立二叉树

一直以来对树稍微存在一点儿恐惧感,最近打算好好顺yi
  • Andrewseu
  • Andrewseu
  • 2014年05月10日 17:03
  • 1968
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++实现二叉树(递归)
举报原因:
原因补充:

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