数据结构 二叉树大部分操作的实现

#ifndef BINTREE_H_INCLUDED
#define BINTREE_H_INCLUDED

#include <iostream>
#include <queue>
#include <stack>
#include <string.h>
using namespace std;

template<class Type>
class BinTree;

template<class Type>
class BinTreeNode
{
public:
    friend class BinTree<Type>;
    BinTreeNode():data(Type()),lChild(NULL),rChild(NULL)
    {}
    BinTreeNode(Type d,BinTreeNode<Type> *m = NULL,BinTreeNode<Type> *n = NULL):data(d),lChild(m),rChild(n)
    {}
    ~BinTreeNode()
    {}
private:
    Type data;
    BinTreeNode<Type> *lChild;
    BinTreeNode<Type> *rChild;
};

typedef enum{L,R}TAG;

template<class Type>
class StackNode
{
public:
    BinTreeNode<Type> *ptr;
    TAG tag;
    StackNode(BinTreeNode<Type> *p = NULL):ptr(p),tag(L)
    {}
};

template<class Type>
class BinTree
{
//public :
//    BinTree<Type>& operator==(BinTree<Type> &t)
//    {
//         if(this != &t)
//            return false;
//        BinTreeNode<Type> *node = t.root;
//        Equal(root,node);
//    }
//
//    bool operator!=(BinTree<Type> &t);    //重载不等于
public:
    BinTree():root(NULL)
    {}
    BinTree(Type ref):root(NULL),Refvalue(ref)
    {}
    BinTree(const BinTree<Type> &bt)        //拷贝构造函数
    {
        root = copy(bt.root);
        Refvalue = bt.Refvalue;
    }

    BinTree<Type>& operator=(const BinTree<Type>& bt)   //重载赋值运算符
    {
        if(this == &bt)
            return *this;
        BinTreeNode<Type> *node = bt.root;
        AssignValue(root,node);
    }

    void createBinTree(char *&str)
    {
        createBinTree(root,str);
    }
    /* //根据先序和中序创建二叉树
	void CreateBinTree(char *VLR, char *LVR, int n)
	{
		CreateBinTree(root, VLR, LVR, n);
	}
	//根据后序和中序创建二叉树
	void CreateBinTree(char *LRV, char *LVR, int n)
	{
		CreateBinTree(root, LRV, LVR, n);
	}*/
    bool IsEmpty()
    {
        return root == NULL;
    }
    void PreOrder()
    {
        PreOrder(root);
    }
    void InOrder()
    {
        InOrder(root);
    }
    void PostOrder()
    {
        PostOrder(root);
    }
    void LevelOrder()
    {
        LevelOrder(root);
    }
    int Height()
    {
        Height(root);
    }
    int Size()
    {
        Size(root);
    }
    void Destory()
    {
        Destory(root);
    }
protected:
    BinTreeNode<Type>* copy(BinTreeNode<Type> *t)           //拷贝构造
    {
        if(t == NULL)
            return NULL;
        else
        {
            BinTreeNode<Type> *p = new BinTreeNode<Type>(t->data);
            p->lChild = copy(t->lChild);
            p->rChild = copy(t->rChild);
            return p;
        }
    }
    void AssignValue(BinTreeNode<Type> *&t, BinTreeNode<Type> *p)  //赋值函数
    {
        if(p == NULL)
            return;
        else
        {
            t->data = p->data;
            AssignValue(t->lChild,p->lChild);
            AssignValue(t->rChild,p->rChild);
        }
    }
//    bool Equal(BinTree<Type> *t1,BinTree<Type> *t2)    //判断相等
//    {
//        if(t1 == NULL && t2 == NULL)
//            return true;
//        else if(t1 == NULL || t2 == NULL)
//            return false;
//        else
//        {
//            if(*t1 != *t2)
//                return false;
//            bool leftEqual = Equal(t1->lChild,t2->lChild);
//            bool rightEqual = Equal(t1->rChild,t2->rChild);
//            if(leftEqual && rightEqual)
//                return true;
//            else
//            {
//                leftEqual = Equal(t1->lChild,t2->rChild);
//                rightEqual = Equal(t1->rChild,t2->lChild);
//                if(leftEqual && rightEqual)
//                    return true;
//                else
//                    return false;
//            }
//        }
//    }
    void createBinTree(BinTreeNode<Type> *&t,char *&str)  //创建二叉树
    {
        //Type x;
       // cin>>x;
        if(*str == Refvalue)
            t = NULL;
        else
        {
            t = new BinTreeNode<Type>(*str);
            createBinTree(t->lChild,++str);
            createBinTree(t->rChild,++str);
        }
    }

	/*//根据先序和中序创建二叉树
	void CreateBinTree(BinTreeNode<Type> *&t, char *VLR, char *LVR, int n)
	{
		if (n == 0)
			return;
		int k = 0;
		while (VLR[0] != LVR[k])
			k++;
		t = new BinTreeNode<Type>(VLR[0]);
		CreateBinTree(t->lChild, VLR + 1, LVR, k);
		CreateBinTree(t->rChild, VLR + k + 1, LVR + k + 1, n - k - 1);
	}
	//根据后序和中序创建二叉树
	void CreateBinTree(BinTreeNode<Type> *&t, char *LRV, char *LVR, int n)
	{
		if (n == 0)
			return;
		int k = 0;
		while (LRV[n - 1] != LVR[k])
			k++;
		t = new BinTreeNode<Type>(LRV[n - 1]);
		CreateBinTree(t->lChild, LRV, LVR, k);
		CreateBinTree(t->rChild, LRV + k, LVR + k + 1, n - k - 1);
	}*/
//    void PreOrder(BinTreeNode<Type> *t)const      //递归方式
//    {
//        if(t != NULL)
//        {
//            cout<<t->data<<" ";
//            PreOrder(t->lChild);
//            PreOrder(t->rChild);
//        }
//    }
    void PreOrder(BinTreeNode<Type> *t)const
    {
        stack<BinTreeNode<Type>*> s;
        if(t != NULL)
            s.push(t);
            BinTreeNode<Type>* p;
        while( p != NULL && !s.empty())
        {
            p = s.top();
            cout<<p->data<<" ";
            s.pop();
            if(p->rChild)
                s.push(p->rChild);
            if(p->lChild)
                s.push(p->lChild);
        }
    }

//    void InOrder(BinTreeNode<Type> *t)const  //递归方式
//    {
//        if(t != NULL)
//        {
//            InOrder(t->lChild);
//            cout<<t->data<<" ";
//            InOrder(t->rChild);
//        }
//    }
    void InOrder(BinTreeNode<Type> *t)const
    {
        stack<BinTreeNode<Type>*> s;
        BinTreeNode<Type>* p = t;
        while( p != NULL || !s.empty())
        {
            while(p!=NULL)
            {
                s.push(p);
                p = p->lChild;
            }
            if(!s.empty())
            {
                p = s.top();
                cout<<p->data<<" ";
                s.pop();
                p = p->rChild;
            }
        }
    }
//    void PostOrder(BinTreeNode<Type> *t)const   //递归方式
//    {
//        if(t != NULL)
//        {
//            PostOrder(t->lChild);
//            PostOrder(t->rChild);
//            cout<<t->data<<" ";
//        }
//    }
    void PostOrder(BinTreeNode<Type> *t)const
    {
        StackNode<Type> node;
        stack< StackNode<Type> > st;
        BinTreeNode<Type> *p = t;
        do
        {
            while(p != NULL)
            {
                node.ptr = p;
                node.tag = L;
                st.push(node);
                p = p->lChild;
            }
            bool flag = true;
            while(flag && !st.empty())
            {
                node = st.top();
                st.pop();
                p = node.ptr;
                switch(node.tag)
                {
                case L:
                    node.tag = R;
                    st.push(node);
                    flag = false;
                    p = p->rChild;
                    break;
                case R:
                    cout<<p->data<<" ";
                    break;
                }
            }
        }while(!st.empty());
    }
    void LevelOrder(BinTreeNode<Type> *t)const   //层次遍历
    {
        queue<BinTreeNode<Type>*> q;
        if(t != NULL)
            q.push(t);
        BinTreeNode<Type>* p;
        while(!q.empty())
        {
            p = q.front();
            cout<<p->data<<" ";
            q.pop();
            if(p->lChild)
                q.push(p->lChild);
            if(p->rChild)
                q.push(p->rChild);
        }
    }
    int Size(BinTreeNode<Type> *t)const  //二叉树结点个数
    {
        if(t == NULL)
            return 0;
        else
            return Size(t->lChild)+Size(t->rChild)+1;
    }
    int Height(BinTreeNode<Type> *t)const   //树的高度
    {
        if(t == NULL)
            return 0;
        else
        {
            return (Height(t->lChild)>Height(t->rChild)?Height(t->lChild):Height(t->rChild))+1;
        }
    }
    void Destory(BinTreeNode<Type> *&t)
    {
        if(t != NULL)
        {
            Destory(t->lChild);
            Destory(t->rChild);
            delete t;
            t = NULL;
        }
    }
private:
    Type  Refvalue;
    BinTreeNode<Type> *root;
};

#endif // BINTREE_H_INCLUDED

时间: 2024-10-14 00:52:04

数据结构 二叉树大部分操作的实现的相关文章

数据结构——二叉树的操作

这里我们主要讲二叉排序树的操作: 什么是二叉排序树? 或者是一棵空树 或者是具有一下性质的二叉树: a.若它的左子树不空,则左子树上所有结点的值均小于它的根节点的值: b.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值: c.它的左.右子树也分别为二叉排序树 Tip : 中序(左根右)遍历二叉排序树会得到一个关键字的递增有序序列 二叉排序树的操作--查找 查找步骤: 若查找的关键字等于根节点,成功 若查找的关键字小于根节点,查找其左子树 若查找的关键字大于根节点,查找其右子树 在左

数据结构——二叉树的遍历

"树"是一种重要的数据结构,本文浅谈二叉树的遍历问题,採用C语言描写叙述. 一.二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每一个结点仅仅有一个父结点,最多含有两个子节点,子节点有左右之分. 2)存储结构 二叉树的存储结构能够採用顺序存储,也能够採用链式存储,当中链式存储更加灵活. 在链式存储结构中,与线性链表类似,二叉树的每一个结点採用结构体表示,结构体包括三个域:数据域.左指针.右指针. 二叉树在C语言中的定义例如以下: struct BiTreeNode{ int c;

数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历

数据结构二叉树-- 编写函数实现:建立二叉树.中序递归遍历.借助栈实现中序非递归遍历.借助队列实现层次遍历.求高度.结点数.叶子数及交换左右子树. ("."表示空子树) #include<stdio.h> #include<stdlib.h> //***********二叉树链表节点结构 typedef char DataType; typedef struct Node {  DataType data;  struct Node*LChild;  struc

数据模型所描述的内容包括三个部分:数据结构、数据操作、数据约束。

http://www.cnblogs.com/joechinochl/articles/5252518.html 1)数据结构:数据模型中的数据结构主要描述数据的类型.内容.性质以及数据间的联系等.数据结构是数据模型的基础,数据操作和约束都建立在数据结构上.不同的数据结构具有不同的操作和约束. 2)数据操作:数据模型中数据操作主要描述在相应的数据结构上的操作类型和操作方式. 3)数据约束:数据模型中的数据约束主要描述数据结构内数据间的语法.词义联系.他们之间的制约和依存关系,以及数据动态变化的规

搜索二叉树的操作

搜索二叉树的数据结构定义: /*二叉搜索树的结构定义*/ typedef struct TreeNode* SearchTree; typedef struct TreeNode* Position; struct TreeNode { int Element; SearchTree Left; SearchTree Right; } 搜索二叉树的插入操作: SearchTree Insert(int x, SearchTree T) { if(T == NULL)//空树 { T = mall

浅谈数据结构-二叉树

浅谈数据结构-二叉树 二叉树是树的特殊一种,具有如下特点:1.每个结点最多有两颗子树,结点的度最大为2.2.左子树和右子树是有顺序的,次序不能颠倒.3.即使某结点只有一个子树,也要区分左右子树. 一.特殊的二叉树及特点 1.斜树 所有的结点都只有左子树(左斜树),或者只有右子树(右斜树).这就是斜树,应用较少 2.满二叉树 所有的分支结点都存在左子树和右子树,并且所有的叶子结点都在同一层上,这样就是满二叉树.就是完美圆满的意思,关键在于树的平衡. 根据满二叉树的定义,得到其特点为: 叶子只能出现

第十章 基本数据结构——二叉树

摘要 书中第10章10.4小节介绍了有根树,简单介绍了二叉树和分支数目无限制的有根树的存储结构,而没有关于二叉树的遍历过程.为此对二叉树做个简单的总结,介绍一下二叉树基本概念.性质.二叉树的存储结构和遍历过程,主要包括先根遍历.中根遍历.后根遍历和层次遍历. 1.二叉树的定义 二叉树(Binary Tree)是一种特殊的树型结构,每个节点至多有两棵子树,且二叉树的子树有左右之分,次序不能颠倒. 由定义可知,二叉树中不存在度(结点拥有的子树数目)大于2的节点.二叉树形状如下下图所示: 2.二叉树的

POJ 3367 Expressions(数据结构-二叉树)

Expressions Description Arithmetic expressions are usually written with the operators in between the two operands (which is called infix notation). For example, (x+y)*(z-w) is an arithmetic expression in infix notation. However, it is easier to write

二叉树插入操作

/* 功能:将一个节点插入到二叉树中节点的子节点中 输入: p,c ,RL p:节点将插入到p所指向的节点的子节点中 c:指向待插入的节点 RL:为0表示插入到左子树,为1表示插入到右子树 输出:bool */ template<typename T> bool BinaryTree<T>::InsertChild(BTNode<T> *p,BTNode<T> *c,int RL) { if(p) { if(RL==0) //插入到p的左节点 { c->