树和二叉树的应用

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define MAXSIZE 100
typedef char ElemType;
typedef struct Node
{
    ElemType data;
    struct Node *lchild;
    struct Node *rchild;
}BitNode,*BitTree;  

int Similar(BitTree T1,BitTree T2);//相似二叉树
void CreateBitTree1(BitTree *T,char *pre,char *in,int len);//由先序和中序构造二叉树
void CreateBitTree2(BitTree *T,char *in,char *post,int len);//由中序和后序构造二叉树
void Visit(BitTree T,BitTree pre,char e,int i);//访问结点e
void PrintLevel(BitTree T);//按层次输出二叉树的结点
void PreOrderTraverse(BitTree T);//先序遍历二叉树的递归实现
void PostOrderTraverse(BitTree T);//后序遍历二叉树的递归实现  

#include "LinkBiTree.h"  

int Similar(BitTree T1,BitTree T2)
{
    if(T1 == NULL && T2 == NULL)
    {
        return 1;
    }
    else if((T1 == NULL && T2 != NULL) || (T1 != NULL && T2 == NULL))
    {
        return 0;
    }
    else
    {
        return (Similar(T1->lchild,T2->lchild)*Similar(T1->rchild,T2->rchild));
    }
}
void CreateBitTree1(BitTree *T,char *pre,char *in,int len)//由先序和中序构造二叉树
{
    int k;
    char *temp;
    if(len <= 0)
    {
        *T = NULL;
        return;
    }
    *T = (BitTree)malloc(sizeof(BitNode));
    (*T)->data = *pre;
    for(temp = in;temp < in+len;temp++)
    {
        if(*pre == *temp)
        {
            break;
        }
    }
    k = temp-in;
    CreateBitTree1(&((*T)->lchild),pre+1,in,k);
    CreateBitTree1(&((*T)->rchild),pre+1+k,temp+1,len-1-k);
}
void CreateBitTree2(BitTree *T,char *in,char *post,int len)//由中序和后序构造二叉树
{
    int k;
    char *temp;
    if(len <= 0)
    {
        *T = NULL;
        return;
    }
    for(temp = in;temp < in+len;temp++)
    {
        if(*(post+len-1) == *temp)
        {
            k = temp-in;
            (*T) = (BitTree)malloc(sizeof(BitNode));
            (*T)->data = *temp;
            break;
        }
    }
    CreateBitTree2(&((*T)->lchild),in,post,k);
    CreateBitTree2(&((*T)->rchild),in+k+1,post+k,len-1-k);
}
void Visit(BitTree T,BitTree pre,char e,int i)//访问结点e
{
    if(T == NULL && pre == NULL)
    {
        printf("\n对不起!你还没有建立二叉树,先建立再访问!\n");
        return;
    }
    if(T == NULL)
    {
        return;
    }
    else if(T->data == e)
    {
        if(pre != NULL)
        {
            printf("%2c的双亲结点是:%2c\n",e,pre->data);
            printf("%2c的结点在%2d层上\n",e,i);
        }
        else
        {
            printf("%2c位于第一层,无双亲结点!\n",e);
        }
    }
    else
    {
        Visit(T->lchild ,T,e,i+1);
        Visit(T->rchild ,T,e,i+1);
    }
}
void PrintLevel(BitTree T)//按层次输出二叉树的结点
{
    BitTree Queue[MAXSIZE];
    int front,rear;
    if(T == NULL)
    {
        return;
    }
    front = -1;
    rear = 0;
    Queue[rear] = T;
    while(front != rear)
    {
        front++;
        printf("%4c",Queue[front]->data);
        if(Queue[front]->lchild != NULL)
        {
            rear++;
            Queue[rear] = Queue[front]->lchild ;
        }
        if(Queue[front]->rchild != NULL)
        {
            rear++;
            Queue[rear] = Queue[front]->rchild ;
        }
    }
}
void PreOrderTraverse(BitTree T)//先序遍历二叉树的递归实现
{
    if(T)
    {
        printf("%4c",T->data);
        PreOrderTraverse(T->lchild);
        PreOrderTraverse(T->rchild);
    }
}
void PostOrderTraverse(BitTree T)//后序遍历二叉树的递归实现
{
    if(T)
    {
        PostOrderTraverse(T->lchild);
        PostOrderTraverse(T->rchild);
        printf("%4c",T->data);
    }
}  

#include "LinkBiTree.h"  

int main(void)
{
    BitTree T,ptr = NULL;
    char ch;
    int len;
    char pre[MAXSIZE],in[MAXSIZE],post[MAXSIZE];
    T = NULL;
    printf("由先序序列和中序序列构造二叉树:\n");
    printf("请你输入先序的字符串序列:");
    gets(pre);
    printf("请你输入中序的字符串序列:");
    gets(in);
    len = strlen(pre);
    CreateBitTree1(&T,pre,in,len);
    printf("你建立的二叉树后序遍历结果是:\n");
    PostOrderTraverse(T);
    printf("\n");
    printf("你建立的二叉树层序遍历结果是:\n");
    PrintLevel(T);
    printf("\n");
    printf("请你输入你要访问的结点:");
    ch = getchar();
    getchar();
    Visit(T,ptr,ch,1);
    printf("由先序序列和中序序列构造二叉树:\n");
    printf("请你输入中序的字符串序列:");
    gets(in);
    printf("请你输入后序的字符串序列:");
    gets(post);
    len = strlen(post);
    CreateBitTree2(&T,in,post,len);
    printf("你建立的二叉树先序遍历结果是:\n");
    PreOrderTraverse(T);
    printf("\n");
    printf("你建立的二叉树层序遍历结果是:\n");
    PrintLevel(T);
    printf("\n");
    printf("请你输入你要访问的结点:");
    ch = getchar();
    getchar();
    Visit(T,ptr,ch,1);
    return 0;
}  

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 12:49:23

树和二叉树的应用的相关文章

树、二叉树、森林的转换

树转换为二叉树 (1)加线.在所有兄弟结点之间加一条连线. (2)去线.树中的每个结点,只保留它与第一个孩子结点的连线,删除它与其它孩子结点之间的连线. (3)层次调整.以树的根节点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明.(注意第一个孩子是结点的左孩子,兄弟转换过来的孩子是结点的右孩子) 森林转换为二叉树 (1)把每棵树转换为二叉树. (2)第一棵二叉树不动,从第二棵二叉树开始,依次把后一棵二叉树的根结点作为前一棵二叉树的根结点的右孩子,用线连接起来. 二叉树转换为树 是树转换为二

树、二叉树、遍历二叉树的总结

首先介绍树: 如上图所示就是一棵树,先介绍树的几个关键名词: 节点:A.B.C.D等都叫节点 节点的度:节点有几个分支,就叫节点的度,比如节点B有2个分支,那B的度为2 终端节点(叶子):没有分支的节点,如E.F.G.H 非终端节点:有分支的节点,如A.B.D.C 节点的层次:自上而下排列层次,A为1层,B为2层,D为3层 树的度:哪个节点的度最大,这个最大的度就是树的度,如图树的度为2 树的深度:简而言之,就是树有几层,如图的树的深度为4 我们接触最多的树是二叉树 二叉树:在计算机科学中,二叉

树和二叉树

以下的内容做为学习笔记,复制别人的,感觉总结的比较好: 第5章 树和二叉树 本章中主要介绍下列内容:  1.树的定义和存储结构  2.二叉树的定义.性质.存储结构  3.二叉树的遍历.线索算法  4.树和二叉树的转换  5.哈夫曼树及其应用课时分配:     1.2两个学时,3四个学时,4两个学时, 5两个学时,上机两个学时重点.难点:     二叉树的遍历.线索算法.哈夫曼树及其应用 第一节 树 1.树的定义和基本运算1.1 定义    树是一种常用的非线性结构.我们可以这样定义:树是n(n≥

数据结构学习笔记(树、二叉树)

树(一对多的数据结构) 树(Tree)是n(n>=0)个结点的有限集.n=0时称为空树.在任意一颗非空树种: (1)有且仅有一个特定的称为根(Root)的结点: (2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1.T2........Tn,其中每一个集合本身又是一棵树,并且称为根的子树. 对于树的定义还需要强调两点:1.n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有一个根结点.2.m>0时,子树的个数没有限制,但它们一定是互不相交的. 结点

6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

课本源码部分 第6章  树和二叉树 - 树的双亲表示法 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑        本源码引入的文件  链接? Status.h.Scanf.c.SequenceStack.c    

树和二叉树-第6章-《数据结构题集》习题解析-严蔚敏吴伟民版

习题集解析部分 第6章 树和二叉树 ——<数据结构题集>-严蔚敏.吴伟民版        源码使用说明  链接??? <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题集解析使用说明        课本源码合辑  链接??? <数据结构>课本源码合辑        习题集全解析  链接??? <数据结构题集>习题解析合辑       相关测试数据下载  链接? 数据包       本习题文档的存放目录:数据结构\▼配套习题解析\▼06 树和二叉树  

基本数据结构学习笔记——树与二叉树

1.树的形式化定义: 树(Tree)是由一个或多个结点组成的有限集合T,其中有一个特定的称为根的结点:其余结点可分为m(m≥0)个互不相交的有限集T1,T2,T3 ,…,Tm,每一个集合本身又是一棵树,且称为根的子树. 2.有关树的基本术语: 1.结点(Node):树中的元素,包含数据项及若干指向其子树的分支. 2.结点的度(Degree):结点拥有的子树数. 3.结点的层次:从根结点开始算起,根为第一层. 4.叶子(Leaf):度为零的结点,也称端结点. 5.孩子(Child):结点子树的根称

树、二叉树基础

刚看到堆排序,顺便记录一下关于树的一些基本概念: 前言 前面介绍的栈.队列都是线性结构(linear structure).而树是非线性结构(non-linear structure).因此,树中的元素之间一般不存在类似于线性结构的一对一的关系,更多地表现为多对多的关系.直观地看,它是数据元素(在树中称为节点)按分支关系组织起来的结构.显然,树形结构是比线性结构更复杂的一种数据结构类型. 一.树 树的定义:树是含有n个节点的有穷集合,其中有一个节点比较特殊称为根节点.在图示树时,用一条边连接两个

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

第五章 树和二叉树

上章回顾 单链表的基本操作,包括插入.删除以及查找 双向链表和循环链表的区别 [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 第五章 第五章 树和二叉树 树和二叉树 [email protected]:Kevin-Dfg/Data-Structures-and-Algorithm-Analysis-in-C.git 预习检查 什么是二叉树 树的遍历有哪几种方式 树有哪些应用 [email pr