您的位置:首页 > 理论基础 > 数据结构算法

数据结构 二叉树

2016-04-15 21:25 274 查看
#ifndef _二叉树_H
#define _二叉树_H

#include <iostream>
#include <queue>  // 队列,

template<class T> class BinaryTree;

template<class T>
class TreeNode  // 这个类用来表示子节点,
{
public:
TreeNode()
{
leftChild = NULL;
rightChild = NULL;
}
T data;
TreeNode<T> *leftChild;  // 左节点,
TreeNode<T> *rightChild; // 右节点,
};

template<class T>
class BinaryTree
{
public:
// 二叉树可以进行的操作,
void InOrder();  // 中序遍历,
void InOrder(TreeNode<T>* currentNode);
void PreOrder(); // 前序遍历,
void PreOrder(TreeNode<T>* currentNode);
void PostOrder();  // 后序遍历,
void PostOrder(TreeNode<T>* currentNode);
void LevelOrder();  // 层序遍历,
void Visit(TreeNode<T>* currentNode);
public:
TreeNode<T> *root;
};

template<class T>
void BinaryTree<T>::LevelOrder()
{
std::queue<TreeNode<T>*> q;
TreeNode<T>* currentNode = root;
while(currentNode)
{
Visit(currentNode);
if(currentNode->leftChild) q.push(currentNode->leftChild);
if(currentNode->rightChild) q.push(currentNode->rightChild);
if(q.empty()) return;
currentNode = q.front();
q.pop();
}
}

template<class T>
void BinaryTree<T>::Visit(TreeNode<T>* currentNode)
{
std::cout << currentNode->data;
}

template<class T>
void BinaryTree<T>::InOrder()
{
InOrder(root); // 调用另外一个函数将根传进去,
}

template<class T>
void BinaryTree<T>::InOrder(TreeNode<T> *currentNode)
{
if(currentNode)
{
InOrder(currentNode->leftChild);  // 显示左节点,
Visit(currentNode);  // 显示当前的节点,
InOrder(currentNode->rightChild);  // 显示右节点,
}
}

template<class T>
void BinaryTree<T>::PreOrder()
{
PreOrder(root);
}

template<class T>
void BinaryTree<T>::PreOrder(TreeNode<T>* currentNode)
{
if(currentNode)
{
Visit(currentNode);
PreOrder(currentNode->leftChild);
PreOrder(currentNode->rightChild);
}
}

template<class T>
void BinaryTree<T>::PostOrder()
{
PostOrder(root);
}

template<class T>
void BinaryTree<T>::PostOrder(TreeNode<T>* currentNode)
{
if(currentNode)
{
PostOrder(currentNode->leftChild);
PostOrder(currentNode->rightChild);
Visit(currentNode);
}
}

#endif


#include <iostream>
#include "二叉树.h"

using namespace std;

int main()
{
BinaryTree<char> tree;
TreeNode<char> 加,减,乘,除,a,b,c,d,e;

加.data = '+';
减.data = '-';
乘.data = '*';
除.data = '/';
a.data = 'A';
b.data = 'B';
c.data = 'C';
d.data = 'D';
e.data = 'E';

tree.root = &加;
加.leftChild = &减;
加.rightChild = &e;
减.leftChild = &乘;
减.rightChild = &d;
乘.leftChild = &除;
乘.rightChild = &c;
除.leftChild = &a;
除.rightChild = &b;
cout << "中序遍历:";
tree.InOrder();  // 中序遍历,
cout << endl;

cout << "前序遍历:";
tree.PreOrder();
cout << endl;

cout << "后序遍历:";
tree.PostOrder();
cout << endl;

cout << "层序遍历:";
tree.LevelOrder();
cout << endl;

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: