二叉树

来源:互联网 发布:js日期转换为数字 编辑:程序博客网 时间:2024/06/02 04:24

一、遍历二叉树

1、前序遍历:根左右

2、中序遍历:左根右

3、后序遍历:左右根

4、层序遍历:一层层





#include"stdafx.h"

#include<iostream>
using namespace std;
template<class T>
struct TreeNode
{
T _data;
TreeNode<T>* _left;
TreeNode<T>* _right;


TreeNode(const T& data=0)
:_data(data)
, _left(NULL)
, _right(NULL)
{


}
};
template<class T>
class BinaryTree
{
typedef TreeNode<T> Node;
public:
BinaryTree()
:_root(NULL)
{}


BinaryTree(const T* arr,const int& len,const T& inval)
{
int i = 0;
_root=_CreatTree(arr, len, inval, i);
}


void PreOrder()
{
_PreOrder(_root);
}


void InOrder()
{
_InOrder(_root);
}


void OutOrder()
{
_OutOrder(_root);
}


private:
Node* _CreatTree(const T* arr, const int& len, const T& inval,int& i)
{
Node* cur = NULL;
if (arr[i] == inval || i >= len)
{
return cur;
}
cur =new  Node(arr[i]);
cur->_left = _CreatTree(arr, len, inval, ++i);
cur->_right = _CreatTree(arr, len, inval, ++i);
return cur; 
}


void _PreOrder(Node* cur)//前序遍历:根左右
{
if (cur == NULL)
{
return;
}
cout << cur->_data << " ";
_PreOrder(cur->_left);
_PreOrder(cur->_right);
}


void _InOrder(Node* cur)//中序遍历:左根右
{
if (cur == NULL)
{
return;
}
_InOrder(cur->_left);
cout << cur->_data << " ";
_InOrder(cur->_right);
}


void _OutOrder(Node* cur)//后序遍历:左右根
{
if (cur == NULL)
{
return;
}
_OutOrder(cur->_left);
_OutOrder(cur->_right);
cout << cur->_data << " ";
}


private:
Node* _root;
};




void TestTree()
{
int arr[] = { 31,23,'#','#',12,56,'#',5,17,78,62,'#','#','#',66,'#',55 };
BinaryTree<int> tree(arr, sizeof(arr) / sizeof(arr[0]), '#');
tree.PreOrder();
cout << endl;
tree.InOrder();
cout << endl;
tree.OutOrder();
}




int main()
{
TestTree();
return 0;
}