《C++实现数据结构》:二叉树

二叉树的定义以及性质在之前的博客里已经说过了,今天来用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;
    } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值