(1)右边这个图是一个二叉树,一个二叉树的节点存在data、左节点和右节点
(2)二叉树遍历方式存在中序遍历、前序遍历、右序遍历和层序遍历。
中序遍历:左节点--中节点--右节点
A/B*C-D+E
前序遍历:中节点--左节点--右节点
+-*/ABCDE
后序遍历:左节点--右节点--中节点
AB/C*D-E+
层序遍历:按照层的方式排列
+-E*D/CAB
废话不多说,直接上代码
二叉树的例图
头文件b_tree.h
#pragma once
#include<iostream>
#include<queue>
//声明二叉树模板类
template <class T> class BinaryTree;
//节点类
template<class T>
class TreeNode
{
public:
TreeNode()
{
leftChild = NULL;
rightChild = NULL;
}
public:
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();
//显示节点data值
void Display(TreeNode<T> *currentNode);
public:
TreeNode<T> *root;
};
template<class T>
void BinaryTree<T>::InOrder()
{
InOrder(root);
}
//显示当前节点data
template<class T>
void BinaryTree<T>::Display(TreeNode<T> *currentNode)
{
std::cout << currentNode->data;
}
//递归实现中序遍历
template<class T>
void BinaryTree<T>::InOrder(TreeNode<T> *currentNode)
{
if (currentNode)
{
InOrder(currentNode->leftChild);
Display(currentNode);
InOrder(currentNode->rightChild);
}
}
template<class T>
void BinaryTree<T>::LevelOrder()
{
//队列queue实现层序遍历
std::queue<TreeNode<T>*> queue_now;
TreeNode<T> *currentNode = root;
while (true)
{
Display(currentNode);
if (currentNode->leftChild)
queue_now.push(currentNode->leftChild);
if (currentNode->rightChild)
queue_now.push(currentNode->rightChild);
if (queue_now.empty())
break;
currentNode = queue_now.front();
queue_now.pop();
}
}
单独讲一下使用queue实现层序遍历,如上所示,先把节点按照从左到右的顺序加入队列,再由此队列头部取出当前节点,显示节点数据。
template<class T>
void BinaryTree<T>::LevelOrder()
{
//队列queue实现层序遍历
std::queue<TreeNode<T>*> queue_now;
TreeNode<T> *currentNode = root;
while (true)
{
Display(currentNode);
if (currentNode->leftChild)
queue_now.push(currentNode->leftChild);
if (currentNode->rightChild)
queue_now.push(currentNode->rightChild);
if (queue_now.empty())
break;
currentNode = queue_now.front();
queue_now.pop();
}
}
main函数中二叉树的创建
#include<iostream>
#include"b_tree.h"
using namespace std;
int main()
{
BinaryTree<char> tree_now;
TreeNode<char> add, sub, mul, div, A, B, C, D, E;
add.data = '+';
sub.data = '-';
mul.data = '*';
div.data = '/';
A.data = 'A';
B.data = 'B';
C.data = 'C';
D.data = 'D';
E.data = 'E';
tree_now.root = &add;
add.leftChild = ⊂
add.rightChild = &E;
sub.leftChild = &mul;
sub.rightChild = &D;
mul.leftChild = ÷
mul.rightChild = &C;
div.leftChild = &A;
div.rightChild = &B;
tree_now.InOrder();
cout << endl;
tree_now.PreOrder();
cout << endl;
tree_now.PostOrder();
cout << endl;
tree_now.LevelOrder();
system("pause");
return 0;
}