二叉树的表示:
数组表示:
链表表示:
二叉树的遍历:
前序遍历
中序遍历
后序遍历
层序遍历
今天我们用链表实现二叉树。
在VS2013中新建项目,在头文件中加入 二叉树.h在源文件中加入main.cpp
//二叉树.h
#ifndef _二叉树_H
#define _二叉树_H
#include<queue>
using namespace std;
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);
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
//main.cpp
#include<iostream>
#include"二叉树.h"
using namespace std;
int main(){
cout << "测试二叉树:" << endl;
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 << "中序遍历:" << endl;
tree.InOrder();
cout << endl;
cout << "前序遍历:" << endl;
tree.PreOrder();
cout << endl;
cout << "后序遍历:" << endl;
tree.PostOrder();
cout << endl;
cout << "层序遍历:" << endl;
tree.LevelOrder();
cout << endl;
system("pause");
return 0;
}
总结:二叉树有数组和链表的优点,二叉树的操作也很重要,这里用链表实现二叉树,借助队列实现了二叉树的层序遍历。