二叉树(C++实现)

来源:互联网 发布:cmmb电视模块软件 编辑:程序博客网 时间:2024/06/05 11:11

二叉树实现

功能:1.遍历二叉树 2.检测二叉树是否为空 3.构建、删除树结点  4.先序(根、左、右),

中序(左、根、右),后序(左、右、根)

《数据结构》南京邮电大学学习期间2016.9.28

/*对于遍历运算, 设计了一个面向用户的公有成员函数
和一个具体实现遍历操作的递归私有成员函数, 两者共同
完成遍历运算的功能。
*/

#pragma once#include<iostream>using namespace std;template<class T>struct BTNode {BTNode() { lchild = rchild = NULL; }BTNode(const T& x){element = x;lchild = rchild = NULL;}BTNode(const T& x, BTNode<T>* l, BTNode<T>* r) {element = x;lchild = l;rchild = r;}T element;BTNode<T>* lchild, *rchild;};template<class T>class BinaryTree {public:BinaryTree() { root = NULL; } ~BinaryTree();bool IsEmpty()const;void Clear();//移去所有结点,使其成为空树bool Root(T& x)const;//若二叉树非空,则x为根的值,并返回true,否则返回falsevoid MakeTree(const T& x, BinaryTree<T>& left, BinaryTree<T>& right);//构造一棵二叉树,根的值为x,以left和right为左右子树void BreakTree(T& x, BinaryTree<T>& left, BinaryTree<T>& right);//拆分二叉树为三部分,x为根的值,left和right分别为左右子树//---------------------(华丽分割线)----------------------void PreOrder(void (*Visit)(T& x));//使用函数Visit访问结点,先序遍历二叉树void InOrder(void (*Visit)(T& x));//中序遍历二叉树void PostOrder(void (*Visit)(T& x));//后序遍历二叉树//---------------------(华丽分割线)----------------------//分割线内的函数面向用户,主要提供一个用户与类内递归循环的一个接口protected:BTNode<T>* root;//指向根结点的指针private:void Clear(BTNode<T>* &t);//---------------------(华丽分割线)----------------------void PreOrder(void (*Visit)(T& x),BTNode<T>*t);void InOrder(void (*Visit)(T& x), BTNode<T>*t);void PostOrder(void (*Visit)(T& x), BTNode<T>*t);//---------------------(华丽分割线)----------------------//分割线内的函数才是主要实现递归遍历算法的函数};template<class T>BinaryTree<T>::~BinaryTree() {Clear();};template<class T>bool BinaryTree<T>::IsEmpty()const {return (root == NULL) ? true : false;};template<class T>void BinaryTree<T>::Clear() {Clear(root);};template<class T>void BinaryTree<T>::Clear(BTNode<T>*&t=root) {if (p!= NULL) {Clear(p->lchild);Clear(p->rchild);delete p;}};template<class T>bool BinaryTree<T>::Root(T& x)const {if (root == NULL)return false;else {x = root.element;return true;}return false;};template<class T>void BinaryTree<T>::MakeTree(const T& x, BinaryTree<T>& left, BinaryTree<T>& right) {if (root || &left == &right)return;//若root非空,说明root已是某二叉树树根root = new BTNode<T>(x,left.root,right.root);left.root = right.root = NULL;//left和right已与新树结合,故将其指针设为空};template<class T>void BinaryTree<T>::BreakTree(T& x, BinaryTree<T>& left, BinaryTree<T>& right) {if (!root || &left == &right || left.root || right.root)return;//如果实参left和right的root非空则说明用户传过来用于获取左右子树的的BTNode指针是某个树的结点x == root->element;left.root = root->lchild; right.root = root->rchild;delete root;root = NULL;};//先序遍历,面向用户template<class T>void BinaryTree<T>::PreOrder(void(*Visit)(T& x)) {PreOrder(Visit, root);};//先序遍历,真正实现的函数template<class T>void BinaryTree<T>::PreOrder(void(*Visit)(T& x), BTNode<T>* t) {if (t) {Visit(t->element);PreOrder(Visit, t->lchild);PreOrder(Visit, t->rchild);}};template<class T>void Visit(T& x) {cout << x << " ";};//中序遍历,面向用户template<class T>void BinaryTree<T>::InOrder(void(*Visit)(T& x)) {InOrder(Visit, root);};//中序遍历,真正实现的函数template<class T>void BinaryTree<T>::InOrder(void(*Visit)(T& x),BTNode<T>*t) {if (t) {InOrder(Visit, t->lchild);Visit(t->element);InOrder(Visit, t->rchild);}};//后序遍历,面向用户template<class T>void BinaryTree<T>::PostOrder(void(*Visit)(T& x)) {InOrder(Visit, root);};//后序遍历,真正实现的函数template<class T>void BinaryTree<T>::PostOrder(void(*Visit)(T& x),BTNode<T>*t) {if (t) {PostOrder(Visit, t->lchild);PostOrder(Visit, t->rchild);Visit(t->element);}};


0 0
原创粉丝点击