二叉树前中后序遍历（递归）

#include<iostream>
using namespace std;
template<class T>
struct BinaryTreeNode
{
BinaryTreeNode* _left;
BinaryTreeNode* _right;
T _data;
BinaryTreeNode(const T& x)
:_left (NULL)
,_right (NULL)
,_data (x)
{}
};

template<class T>
class BinaryTree
{
public:
BinaryTree()
:_root(NULL)
{}
BinaryTree(const T* a,size_t size)
{
size_t index = 0;
_root = _CreateTree(a,size,index);//构建树
}

BinaryTree (const BinaryTree<T>& s)
:_root ->_left(s._root ->_left )
,_root ->_right(s._root ->_right )
,_root ->_data(s._root ->_data )
{
s._root ->_left = NULL;
s._root ->_right = NULL;
}

size_t size()
{
return _size(_root);
}

size_t Depth()
{
return _Depth(_root);
}

size_t leafSize()
{
return _leafSize(_root);
}

void prevorder()//前序遍历《根左右》
{
_prevorder(_root);
cout <<endl;
}

void Inorder()//中序遍历《左根右》
{
_Inorder(_root);
cout<<endl;
}

void postorder()//后序遍历《左右根》
{
_postorder(_root);
cout<<endl;
}
public:
BinaryTreeNode<T>* _CreateTree(const T* a,size_t size,size_t& index)
{
BinaryTreeNode<T>* root = NULL;
if(a[index] != '#'&& index < size)
{
root = new BinaryTreeNode<T>(a[ index ]);//创建树节点
root->_left = _CreateTree(a,size,++index);
root->_right = _CreateTree(a,size,++index);

}
return root;
}

size_t _size(BinaryTreeNode<T>* root)//节点个数
{
if(root == NULL)
{
return 0;
}
return (_size( root->_left ))+(_size ( root->_right ))+1;//每递归一次都加上他的上个节点，也就是根节点。所以只加一
}

size_t _Depth(BinaryTreeNode<T>* root)//树的深度
{
if(root == NULL)
return 0;
size_t a = _Depth (root->_left )+1;
siez_t b = _Depth (root->_right)+1;
return a>b?a:b;
}

size_t _leafSize(BinaryTreeNode<T>* root)  //叶个数
{
if(root == NULL)
return 0;
else if(root->_left  ==NULL && root->_right == NULL )
return 1;
else
return _leafSize(root ->_left)+_leafSize (root->_right );
}

void _prevorder(BinaryTreeNode<T>* root)
{
if(root == NULL)
return ;
cout<<root->_data <<" ";
_prevorder(root->_left );
_prevorder(root->_right );

}

void _Inorder(BinaryTreeNode<T>* root)
{
if(root != NULL)
{
_Inorder(root->_left );
cout<<root->_data <<" ";
_Inorder(root->_right );
}
}

void _postorder(BinaryTreeNode<T>* root)
{
if(root != NULL )
{
_postorder(root->_left );
_postorder(root->_right );
cout<<root->_data <<" ";
}
}

protected:
BinaryTreeNode<T>* _root;

};
int main()
{
int a1[9]={1,2,3,'#',4,'#','#',5, 6};
int a2[15] = {1,2,'#',3,'#','#',4,5,'#',6,'#',7,'#','#',8};
BinaryTree<int> bt(a1,9);
bt.prevorder ();
bt.Inorder ();
bt.postorder ();
return 0;
}

数据结构 二叉树的递归算法、前序、中序、后序遍历(c语言实现)

2015-12-18 23:08:55

数据结构例程——二叉树遍历的递归算法

2015-10-19 20:33:59

二叉树遍历之递归算法

2012-08-13 18:21:30

数据结构之二叉树的前序遍历、中序遍历、后序遍历、层序遍历

2016-10-21 21:49:08

二叉树系列(1)已知二叉树的中序遍历和前序遍历，如何求后序遍历

2011-09-24 11:04:26

二叉树前序、中序、后序遍历的相互求法

2016-03-30 02:45:29

树的先序、中序和后序遍历方式

2012-06-13 16:56:25

算法题目-二叉树前中后序遍历

2017-06-14 13:46:00

二叉树前序，中序，后序遍历详解

2012-07-09 15:28:13

二叉树前序、中序、后序遍历非递归写法的透彻解析

2014-07-06 22:14:43