二叉树的定义以及性质在之前的博客里已经说过了,今天来用C++实现二叉树。提供先序遍历、中序遍历、后序遍历的递归和非递归的两种实现方式,也提供了层次遍历的用队列实现方式。详细的看代码学习吧,关键注释都有加上了。
————————————————————2017.4.4补充————————————————————
今天补充了反转二叉树的实现,提供递归和非递归两个版本。
————————————————————————————————————————————————
//
// Created by huxijie on 17-3-20.
// 二叉树
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
//二叉树结点类
template <typename T>
struct BTNode{
T elemet;
BTNode<T>* lChild,*rChild;
BTNode() {
lChild = rChild = NULL;
}
BTNode(const T& x,BTNode<T>* l, BTNode<T> *r) {
elemet = x;
lChild = l;
rChild = r;
}
};
//二叉树类
template <typename T>
class BinaryTree{
private:
BTNode<T>* root;
void Clear(BTNode<T>* t);
void PreOrder(void (*Visit)(T &x),BTNode<T> *r);
void InOrder(void (*Visit)(T &x),BTNode<T> *r);
void PostOrder(void (*Visit)(T &x),BTNode<T> *r);
void LayerOrder(void (*Visit)(T &x), BTNode<T> *r);
int Size(BTNode<T>* r);
BTNode<T>* Copy(BTNode<T> *r);
BTNode<T>* InvertTree(BTNode<T> *root);
public:
BinaryTree();
~BinaryTree();
bool IsEmpty() const;
void Clear(); //移去所有结点,成为空二叉树
bool Root(T& x) const; //若二叉树非空,则x为根的值,并返回true
//构造一棵二叉树,根的值为x,以left和right为左右子树
void MakeTree(const T& x,BinaryTree<T>& left,BinaryTree<T>& right);
void PreOrder(void (*Visit)(T &x)); //先序遍历
void InOrder(void (*Visit)(T &x)); //中序遍历
void PostOrder(void (*Visit)(T &x)); //后序遍历
void LayerOrder(void (*Visit)(T &x)); //层次遍历
int Size(); //结点个数
BTNode<T>* Copy(); //二叉树的复制
void InvertTree(); //反转二叉树
};
template <typename T>
BinaryTree<T>::BinaryTree() {
root = NULL;
}
template <typename T>
BinaryTree<T>::~BinaryTree() {
Clear();
}
template <typename T>
bool BinaryTree<T>::IsEmpty() const {
if (root == NULL) {
return true;
}