码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树

时间:2016-03-06 17:42:27      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:二叉树

二叉树:二叉树是一棵特殊的树,二叉树每个节点最多有两个孩子结点,分别称为左孩子和右孩子。

满二叉树:高度为N的满二叉树有2^N - 1个节点的二叉树。

完全二叉树: 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树

二叉树的4种遍历方式

前序遍历(先根遍历):(1):先访问根节点;  (2):前序访问左子树;(3):前序访问右子树; 

中序遍历:          (1):中序访问左子树;(2):访问根节点;    (3):中序访问右子树;  

后序遍历(后根遍历):(1):后序访问左子树;(2):后序访问右子树;(3):访问根节点;      

层序遍历:         (1):一层层节点依次遍历。    



#pragma once
#include<iostream>
#include<queue>
using namespace std;
template<class T>
struct BinaryTreeNode
{
	T _data;
	BinaryTreeNode* _left;
	BinaryTreeNode* _right;
	BinaryTreeNode(const T& x)
		:_data(x)
		, _left(NULL)
		, _right(NULL)
	{}
};
template<class T>
class BinaryTree
{
protected:
	BinaryTreeNode<T>* _root;
protected:
	//先序遍历产生二叉树
	BinaryTreeNode<T>* _CreateBinaryTree(T* arr, size_t &index, size_t size)
	{
		BinaryTreeNode<T>* root = NULL;
		if (index < size&&arr[index] != ‘#‘)
		{
			root = new BinaryTreeNode<T>(arr[index]);
			root->_left = _CreateBinaryTree(arr, ++index, size);
			root->_right = _CreateBinaryTree(arr, ++index, size);
		}
		return root;
	}
	void _PreOrder(BinaryTreeNode<T>* root)
	{
		if (root != NULL)
		{
			cout << root->_data << " ";
			_PreOrder(root->_left);
			_PreOrder(root->_right);
		}
		return;
	}
	void _InOrder(BinaryTreeNode<T>* root)
	{
		if (root != NULL)
		{
			_InOrder(root->_left);
			cout << root->_data<<" ";
			_InOrder(root->_right);
		}
		return;
	}void _PostOrder(BinaryTreeNode<T>* root)
	{
		if (root != NULL)
		{
			_PostOrder(root->_left);
			_PostOrder(root->_right);
			cout << root->_data << " ";
		}
		return;
	}
	void _Clear(BinaryTreeNode<T>* root)
	{
		if (root)
		{
			_Clear(root->_left);
			_Clear(root->_right);
			delete root;
		}
	}
	int  _Size(BinaryTreeNode<T>* root)
	{
		int size = 0;
		if (root)
		{
			size += (_Size(root->_left)+1);
			size += _Size(root->_right);
		}
		return  size;
	}
	int _Depth(BinaryTreeNode<T>* root)
	{
		int depth = 0;
		if (root)
		{
			int leftDepth = _Depth(root->_left);
			int rightDepth = _Depth(root->_right);
			depth = leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1;
		}
		return depth;
	}
public:
	BinaryTree()
		:_root(NULL)
	{}
	BinaryTree(T* a, size_t size)
	{
		size_t index = 0;
		_root = _CreateBinaryTree(a, index, size);
	}
	~BinaryTree()
	{
		_Clear(_root);
	}
	void  PreOrder()
	{
		_PreOrder(_root);
		cout << endl;
	}
	void  InOrder()
	{
		_InOrder(_root);
		cout << endl;
	}
	void  PostOrder()
	{
		_PostOrder(_root);
		cout << endl;
	}
	void LevelOrder()
	{
		
		queue<BinaryTreeNode<T>*> q;
		q.push(_root);
		while (!q.empty())
		{
			if (q.front())
			{
				cout << q.front()->_data << "  ";
				if (q.front()->_left)
					q.push(q.front()->_left);
				if(q.front()->_right)
				    q.push(q.front()->_right);
				q.pop();
			}
		}
		cout << endl;
	}
	int Size()
	{
		return  _Size(_root);
	}
	int Depth()
	{
		return _Depth(_root);
	}
};
#include"BinaryTree.h"
void Test1()
{
	BinaryTree<int> b1;
	int array[10] = { 1, 2, 3, ‘#‘, ‘#‘, 4, ‘#‘, ‘#‘, 5, 6 };
	BinaryTree<int> b2(array, 10);
	b1.PreOrder();
	b2.PreOrder();
	b2.InOrder();
	b2.PostOrder();
	b2.LevelOrder();
	cout << b1.Size() << "  " << b2.Size() << endl;
	cout << b1.Depth() << "  " << b2.Depth() << endl;
	
}
int main()
{
	Test1();
	system("pause");
	return 0;
}


本文出自 “小止” 博客,请务必保留此出处http://10541556.blog.51cto.com/10531556/1748098

二叉树

标签:二叉树

原文地址:http://10541556.blog.51cto.com/10531556/1748098

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!