数据结构7_链二叉树

本文实现了二叉树了存储实现,起先决定和队列与栈一样,设计一个二叉树节点的类型class treeNode,再构建一个二叉树类处理节点的生成,遍历等,结果在做二叉树创建函数CreateBitTree时遇到了很多问题,最后才发现直接构建一个二叉树类型就可以了。

这里主要介绍利用先序序列和中序序列重构一个二叉树的函数

#include<iostream>
#include<math.h>
using namespace std;
class BitTree
{
    char *data;
    BitTree *lchild, *rchild;
    void preorder(BitTree *&T);   //先序遍历调用函数
    void inorder(BitTree *&T);    //中序遍历调用函数
    void postorder(BitTree *&T);   //后序遍历调用函数
public:
    void CreateBitTree(BitTree *&T);//二叉树创建函数

void PreOrder(BitTree *&T)   //先序遍历
    {
        cout<<"先序遍历输出序列如下:"<<endl;
        preorder(T);
        cout<<endl;
    }
    void InOrder(BitTree *&T)    //中序遍历
    {
        cout<<"中序遍历输出序列如下:"<<endl;
        inorder(T);
        cout<<endl;
    }
    void PostOrder(BitTree *&T)//后序遍历
    {
        cout<<"后序遍历输出序列如下:"<<endl;
        postorder(T);
        cout<<endl;
    }
    void CrtBt(BitTree *&T,char **&pre,char **&ino,int pe,int is,int n,int length);//利用先序中序序列重构二叉树
};

void BitTree::CreateBitTree(BitTree *&T)//二叉树创建函数定义
{
    char *ch=new char(10);
    cout<<"请输入当前节点字符:"<<endl;
    cin>>ch;
    if(*ch==‘#‘)        //定义如果输入为‘#’时表示没有该节点
        T=NULL;
    else
    {
        if(!(T=new BitTree))
        {
            cout<<"overflow"<<endl;
            return;
        }
        T->data=new char(strlen(ch)+1);
        strcpy(T->data,ch);
        cout<<"初始化 "<<T->data<<"的左节点:";
        CreateBitTree(T->lchild);      //构建T节点的左子树
        cout<<"初始化 "<<T->data<<"的右节点:";
        CreateBitTree(T->rchild);      //构建T节点的右子树
    }
}
void BitTree::preorder(BitTree *&T)//先序遍历
{
    if(T!=NULL)            //当前节点存在的话先输出当前节点的内容,在遍历其左右子树节点
    {
        cout<<T->data<<"    ";
        preorder(T->lchild);
        preorder(T->rchild);
    }
}
void BitTree::inorder(BitTree *&T)//中序遍历
{
    if(T!=NULL)          //当前节点存在,先遍历其左子树节点,然后输出当前节点内容,再遍历右子树节点
    {
       
        inorder(T->lchild);
        cout<<T->data<<"    ";
        inorder(T->rchild);
    }
}
void BitTree::postorder(BitTree *&T)//后序遍历
{
    if(T!=NULL)          //当前节点存在,先遍历其左子树节点,然后输出当前节点内容,再遍历右子树节点
    {
       
        postorder(T->lchild);
        postorder(T->rchild);
        cout<<T->data<<"    ";

}
}
int search(char *ino[],char *ps,int n)//字符查询函数,查找ino字符串中是否有与ps一致
{
    int point=0;
    while(strcmp(*(ino+point),ps)!=0&&point<n)
    {
        point++;
    }
    if(point<n)
        return point;
    else
        return -1;

}

void BitTree::CrtBt(BitTree *&T,char **&pre,char **&ino,int ps,int is,int n,int length)
{
    /*已知pre[ps+n-1]是该二叉树的先序序列,
    ino[is+n-1]是二叉树的中序序列
    本算法由此两个序列重构二叉树
    核心思想:利用先序序列确定树根,然后用中序序列划分左右子树,
    并在左右子树不断重复以上步骤,知道所有序列都分配完
    */
    if(n==0)
        T=NULL;
    else
    {
        int k=search(ino,*(pre+ps),length);  //查询先序的某个节点在中序序列的位置
        if(k==-1) T=NULL;
        else
        {
            if(!(T=new BitTree))
            {
                cout<<"overflow"<<endl;
                return;
            }
            T->data=new char(strlen(*(pre+ps))+1);
            strcpy(T->data,*(pre+ps));
            if(k==is)
                T->lchild=NULL;
            else
                CrtBt(T->lchild,pre,ino,ps+1,is,k-is,length);//构建左子树
            if(k==is+n-1)
                T->rchild=NULL;
            else
                CrtBt(T->rchild,pre,ino,ps+1+(k-is),k+1,n-(k-is)-1,length);//构建右子树
        }
    }
}
void main()
{
    int n=7;
    char **pre;
    char **ino;
    pre=new char*[7];
    ino=new char*[7];
    cout<<"input pre"<<endl;
    for(int i=0;i<n;i++)
    {
        pre[i]=new char(1);
        cin>>pre[i];
    }
    cout<<"input ino"<<endl;
    for(int i=0;i<n;i++)
    {
        ino[i]=new char(1);
        cin>>ino[i];
    }
    BitTree *T;
    T->CrtBt(T,pre,ino,0,0,n,n);
    T->PostOrder(T);
    T->PreOrder(T);
    T->InOrder(T);
}

来自为知笔记(Wiz)

数据结构7_链二叉树

时间: 2024-07-31 00:21:05

数据结构7_链二叉树的相关文章

【数据结构】之二叉树的java实现

二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要. 二叉树(BinaryTree)是n(n≥0)个结点的有限集,它或者是空集(n=0),或者由一个根结点及两棵互不相交的.分别称作这个根的左子树和右子树的二叉树组成. 这个定义是递归的.由于左.右子树也是二叉树, 因此子树也可为空树.下图中展现了五种不同基本形态的二叉树. 其中 (a) 为空树, (b

javascript实现数据结构:线索二叉树

遍历二叉树是按一定的规则将树中的结点排列成一个线性序列,即是对非线性结构的线性化操作.如何找到遍历过程中动态得到的每个结点的直接前驱和直接后继(第一个和最后一个除外)?如何保存这些信息? 设一棵二叉树有n个结点,则有n-1条边(指针连线) , 而n个结点共有2n个指针域(Lchild和Rchild) ,显然有n+1个空闲指针域未用.则可以利用这些空闲的指针域来存放结点的直接前驱和直接后继信息. 对结点的指针域做如下规定: 1.若结点有左子树,则其leftChild域指示其左孩子,否则令leftC

数据结构---树、二叉树、森林

1.基本术语: 度:有两种度"结点的度"与"树的度".结点的度指的是一个结点子树的个数:树的度是指树中结点度的最大值. 叶子结点:指的是没有子树的结点. 层:树是有层次的,一般根结点为第0层.规定根结点到某结点的路径长度为该结点的层数. 深度:树中结点的最大层数 兄弟:同一双亲的结点,互为兄弟 堂兄弟:双亲在同一层次的结点,互为堂兄弟 祖先:从根结点到该结点的路径上的所有结点都是该结点的祖先. 子孙:以某一结点为根的子树上的所有结点都是该结点的子孙 森林:n棵互不相

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f

SDUT 3340 数据结构实验之二叉树一:树的同构

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含

数据结构快速回顾——二叉树 解幂子集问题

回溯法是设计递归的一种常用方法,它的求解过程实质上就是一个先序遍历一棵"状态树"的过程,只是这棵树不是遍历前预先建立的而是隐含在遍历过程中的. 下面举一个例子:求含n个元素的集的幂集:集合A={ {1,2,3}, {1,2}, {1,3}, {1}, {2,3},{2},{3},{}}; //{}表示空集合从集合A的每一个元素的角度看,它只有两种状态:或者是属于幂集的元素集,或不属于幂集元素集,则求幂集的过程就可以看成是依次对集合A中的元素进行"取","舍

数据结构快速回顾——二叉树

二叉树(Binary Tree)是个有限元素的集合,该集合或者为空.或者由一个称为根(root)的元素及两个不相交的.被分别称为左子树和右子树的二叉树组成.当集合为空时,称该二叉树为空二叉树.在二叉树中,一个元素也称作一个结点. 基本概念: (1)结点的度.结点所拥有的子树的个数称为该结点的度. (2)叶结点.度为0的结点称为叶结点,或者称为终端结点. (3)分枝结点.度不为0的结点称为分支结点,或者称为非终端结点.一棵树的结点除叶结点外,其余的都是分支结点. (4)左孩子.右孩子.双亲.树中一