`

二叉树的链式实现

 
阅读更多
binaryTree.h
#ifndef LINKEDBINARYTREE_H
#define LINKEDBINARYTREE_H

#include<iostream>
using namespace std;

template<typename T>
class BinTreeNode{
public:
    T data;
    BinTreeNode<T> *leftChild,*rightChild;
    BinTreeNode():leftChild(NULL),rightChild(NULL){}
    BinTreeNode(T x,BinTreeNode<T> *l=NULL,BinTreeNode<T>*r=NULL)
        :data(x),leftChild(l),rightChild(r){}
};

template<typename T>
class BinaryTree{
public:
    BinaryTree():root(NULL){}
    BinaryTree(T value):RefValue(value),root(NULL){}
    BinaryTree(BinaryTree<T>& s);
    ~BinaryTree(){destroy(root);}
    bool IsEmpty(){
        return root==NULL?true:false;
    }
    BinTreeNode<T> *Parent(BinTreeNode<T>* current){
        return (root==NULL||root==current)?
                    NULL:Parent(root,current);
    }
    BinTreeNode<T> *LeftChild(BinTreeNode<T>* current){
        return current!=NULL?current->leftChild:NULL;
    }
    BinTreeNode<T> *rightChild(BinTreeNode<T>* current){
        return current!=NULL?current->rightChild:NULL;
    }
    int Height(){
        return Height(root);
    }
    int Size(){
        return Size(root);
    }
    BinTreeNode<T> *getRoot()const{
        return root;
    }
    void preOrder(void(* visit)(BinTreeNode<T> *p)){
        preOrder(root,visit);
    }
    void inOrder(void(* visit)(BinTreeNode<T> *p)){
        inOrder(root,visit);
    }
    void postOrder(void(* visit)(BinTreeNode<T> *p)){
        postOrder(root,visit);
    }
    void levelOrder(void(* visit)(BinTreeNode<T> *p));
    int Insert(const T& item);
    BinTreeNode<T> *Find(T& item)const;
protected:
    BinTreeNode<T> *root;
    T RefValue;//数据输入停止标志
    void createBinTree(istream& in,BinTreeNode<T>*& subTree);
    bool Insert(BinTreeNode<T> *& subTree,const T& x);
    void destroy(BinTreeNode<T> *& subTree);
    bool Find(BinTreeNode<T> * subTree,const T& x)const;
    BinTreeNode<T> *Copy(BinTreeNode<T> *orignode);
    int Height(BinTreeNode<T> *subTree)const;
    int Size(BinTreeNode<T> *subTree)const;
    BinTreeNode<T> *Parent(BinTreeNode<T>* subTree,
                           BinTreeNode<T>* current);
    //BinTreeNode<T> *Find(BinTreeNode<T>* subTree,const T& x)const;
    void Traverse(BinTreeNode<T> *subTree,ostream& out);
    void preOrder(BinTreeNode<T>& subTree,
                  void (*visit)(BinTreeNode<T> *p));
    void inOrder(BinTreeNode<T>& subTree,
                 void (*visit)(BinTreeNode<T> *p));
    void postOrder(BinTreeNode<T>& Tree,
                   void (*visit)(BinTreeNode<T> *p));
    friend istream& operator>>(istream& in,BinaryTree<T>& Tree);
    friend ostream& operator<<(ostream& out,BinaryTree<T>& Tree){
        out << "preOrder" << endl;
        Tree.Traverse(Tree.root,out);
        out << endl;
        return out;
    }
};

#endif // LINKEDBINARYTREE_H


binaryTree.cpp
#include"LinkedBinaryTree.h"
#include<iostream>
#include<stdlib.h>
#include"../T3/Stack.h"
using namespace std;

template<typename T>
void BinaryTree<T>::destroy(BinTreeNode<T> *&subTree)
{
    if(subTree!=NULL){
        destroy(subTree->leftChild);//递归删除左子树
        destroy(subTree->rightChild);//递归删除右子树
        delete subTree;
    }
}

/*
  从subTree向下搜索current的父结点
  */
template<typename T>
BinTreeNode<T>*
BinaryTree<T>::Parent(BinTreeNode<T> *subTree, BinTreeNode<T> *current)
{
    if(subTree==NULL)
        return NULL;
    if(subTree->leftChild||subTree->rightChild==current)
        return subTree;
    BinTreeNode<T> *p;
    if((p=Parent(subTree->leftChild,current))!=NULL)
        return p;
    else
        return Parent(subTree->rightChild,current);
}

template<typename T>
void BinaryTree<T>::Traverse(BinTreeNode<T> *subTree, ostream &out)
{
    if(subTree!=NULL){
        out << subTree->data << ",";
        Traverse(subTree->leftChild,out);
        Traverse(subTree->rightChild,out);
    }
}

template<typename T>
void BinaryTree<T>::createBinTree(istream &in, BinTreeNode<T> *&subTree)
{
    Stack<BinTreeNode<char>*> s;
    subTree = NULL;
    BinTreeNode<char> *p,*t;
    int k;
    char ch;
    in >> ch;
    while(ch!=RefValue){
        switch(ch){
        case '(':
            s.Push(p);
            k=1;
            break;
        case ')':
            s.Pop(t);
            break;
        case ',':
            k=2;
            break;
        default:
            p=new BinTreeNode<char>(ch);
            if(subTree==NULL)
                subTree=p;
            else if(k==1){
                s.getTop(t);
                t->leftChild=p;
            }else{
                s.getTop(t);
                t->rightChild=p;
            }
        }
        in>>ch;
    }
}

template<typename T>
void BinaryTree<T>::inOrder(BinTreeNode<T>& subTree,
             void (*visit)(BinTreeNode<T> *p))
{
    if(subTree!=NULL){
        InOrder(subTree->leftChild,visit);
        visit(subTree);
        InOrder(subTree->rightChild,visit);
    }
}

template<typename T>
void BinaryTree<T>::preOrder(BinTreeNode<T>& subTree,
              void (*visit)(BinTreeNode<T> *p))
{
    if(subTree!=NULL){
        visit(subTree);
        PreOrder(subTree->leftChild,visit);
        PreOrder(subTree->rightChild,visit);
    }
}

/*
  后序遍历
  */
template<typename T>
void BinaryTree<T>::postOrder(BinTreeNode<T>& subTree,
               void (*visit)(BinTreeNode<T> *p))
{
    if(subTree!=NULL){
        postOrder(subTree->leftChild,visit);
        postOrder(subTree->rightChild,visit);
        visit(subTree);
    }
}

template<typename T>
int BinaryTree<T>::Size(BinTreeNode<T> *subTree)const
{
    if(subTree==NULL)
        return 0;
    return 1+Size(subTree->leftChild)+Size(subTree->rightChild);
}

template<typename T>
int BinaryTree<T>::Height(BinTreeNode<T> *subTree) const
{
    if(subTree==NULL)
        return 0;
    int leftHeight = Height(subTree->leftChild);
    int rightHeight = Height(subTree->rightChild);
    int height = leftHeight>rightHeight?leftHeight:rightHeight;
    height = height+1;
    return height;
}

template<typename T>
BinTreeNode<T> *BinaryTree<T>::Copy(BinTreeNode<T> *orignode)
{
    if(orignode==NULL)
        return NULL;
    BinTreeNode<T> *temp = new BinTreeNode<T>;
    temp->data = orignode->data;
    temp->leftChild = Copy(orignode->leftChild);
    temp->rightChild = Copy(orignode->rightChild);
    return temp;
}

template<typename T>
BinaryTree<T>::BinaryTree(BinaryTree<T> &s)
{
    root = Copy(s.root);
}

//template<typename T>
//void BinaryTree<T>::CreateBinTree(ifstream& in,BinTreeNode<T>*& subTree)
//{
//    T item;
//    if(!in.eof()){
//        in>>item;
//        if(item!=RefValue){
//            subTree = new BinTreeNode<T>(item);
//            assert(subTree!=NULL);
//            CreateBinTree(in,subTree->leftChild);
//            CreateBinTree(in,subTree->rightChild);
//        }else{
//            subTree=NULL;
//        }
//    }
//}

template<typename T>
void PrintBTree(BinTreeNode<T> *BT)
{
    if(BT!=NULL){
        cout << BT->data;
        if(BT->leftChild!=NULL||BT->rightChild!=NULL){
            cout << '(';
            PrintBTree(BT->leftChild);
            cout << ',';
            if(BT->rightChild!=NULL)
                PrintBTree(BT->rightChild);
            cout << ')';
        }
    }
}


分享到:
评论

相关推荐

    数据结构 二叉树 链式

    总的来说,这个资源提供了深入理解二叉树链式表示和遍历方法的实践机会。通过分析代码、阅读实验报告并运行示例程序,学习者可以强化数据结构的知识,提高编程技能,这对于任何IT专业人士来说都是非常宝贵的经验。

    02二叉树链式结构实现_BiTreeLink.c

    02二叉树链式结构实现_BiTreeLink.c

    二叉树的链式存储

    二叉树的链式存储实现代码

    二叉树链式和顺序结构

    在实现二叉树时,我们通常有两种主要的数据结构表示方式:链式结构和顺序结构。 **链式二叉树** 链式二叉树是二叉树最常见的表示方法,每个节点包含三个部分:数据域、指向左子节点的指针和指向右子节点的指针。...

    二叉树链式存储结构的三种遍序

    此代码主要是介绍了二叉树的链式存储结构的前序遍历,中序遍历,后序遍历三种方式

    C++实现二叉树(链式存储)

    C++实现二叉树(链式存储) 本文将详细介绍使用C++语言实现的链式存储二叉树的设计和实现原理。 一、链式存储二叉树的基本概念 链式存储二叉树是一种使用链表存储节点的二叉树实现方式。每个节点包含一个值和两个...

    由先序和中序遍历序列,构造二叉树链式存储结构

    对于给定的先序和中序遍历序列,可以唯一地构造出相应的二叉树链式存储结构。这是因为这两种遍历方式提供了足够的信息来恢复树的形态。 **前序遍历**: 在前序遍历中,访问顺序是根节点 -&gt; 左子树 -&gt; 右子树。因此...

    线索化二叉树的实现

    "线索化二叉树的实现" 在计算机科学中,二叉树是一种重要的数据结构,它广泛应用于各种领域,如数据库、文件系统、编译器等。线索化二叉树是一种特殊的二叉树,它在二叉树的每个节点中添加了指向其前驱和后继节点的...

    链式存储二叉树基本操作函数.rar

    链式存储二叉树是一种在计算机科学中用于表示和操作二叉树的数据结构。与数组存储方式不同,链式存储不依赖于连续的内存空间,而是通过指针连接各个节点,使得二叉树可以在内存中灵活分布。这种存储方式特别适用于...

    C++ 二叉树链式存储 按层遍历 输出叶子 左右树交换 实例 源文件

    1.对给定二叉树用链式链式存储结构;利用队列与栈对二叉树进行运算。 2.按层次输出所有结点。 3.输出所有叶子结点。 4.将所有左右子树值交换。

    数据结构实验报告-实现二叉树的基本操作-用顺序存储和链式存储结构

    要求选用顺序存储结构和二叉链表存储结构实现抽象数据类型二叉树的基本操作。有个亮点是利用字符在dos界面显示二叉树的结构形态。 里面包含了完整的源程序和实验报告文档。 实验报告包含了完整的步骤包括: 一.抽象...

    关于二叉树的链式存储

    链式存储是二叉树的一种常见实现方式,与数组存储相比,它更灵活且更适合动态变化的树结构。 链式存储二叉树的关键在于每个节点包含三个字段:数据字段、指向左子节点的指针和指向右子节点的指针。这样的结构允许...

    链式结构存储二叉树的基本操作

    采用链式结构存放二叉树,实现二叉数的创建,实现二叉数的遍历(前序,后序,中序层次遍历),分别求二叉树的叶子结点和结点的数目,二叉树的查找,二叉树的深度。

    二叉树 树 链式存储 指针 链表

    在二叉树的实现中,最常见的方式是链式存储。链式存储通过指针连接各个节点,每个节点包含数据以及指向其子节点的指针。这种存储方式允许动态地增加或减少节点,使得内存分配更加灵活。在链式存储的二叉树中,每个...

    链式二叉树 部分参考代码

    在这个压缩包中,包含的文件可能是关于链式二叉树实现的不同部分或不同方法。 链式二叉树的核心概念是节点,每个节点包含数据和两个指向子节点的指针。在链式二叉树中,节点的连接方式决定了树的形态。例如,如果每...

    C++线索二叉树类实现

    在C++中实现线索二叉树需要理解二叉树的基本概念以及链式存储结构。本文将深入探讨线索二叉树的原理和C++实现。 首先,我们要明确二叉树的基本概念。二叉树是由n(n&gt;=0)个有限节点组成的数据结构,这些节点通过边...

    C语言 二叉树的链式存储实例

    实现二叉树的基本操作:建立、遍历、计算深度、结点数、叶子数等。 输入C,先序创建二叉树,#表示空节点; 输入H:计算二叉树的高度; 输入L:计算二叉树的叶子个数; 输入N:计算二叉树节点总个数; 输入1:先序...

    链式二叉树的实现.sln

    本例程详细讲解了链式二叉树的实现方法和实现的函数,对于学习数据结构中的链式二叉树具有很好的学习作用,可以充分理解二叉树的结构和特性

Global site tag (gtag.js) - Google Analytics