二叉树接口及其应用

原创 2007年10月14日 19:42:00
 二叉树为连接于一对二叉树的一个外部节点或内部节点,这两棵二叉树分别称为这个节点的左子树和右子树。这个定义表明,二叉树本身就是一个抽象的数学概念。当我们制定计算机表示方式时,就是在制定一个具体实现。这种情形与用float表示实数,用int表示整数等没有区别。当我们绘制一颗树,根节点通过与左边的左子树以及右边的右子树连接,此时,就是在选择一种方便的具体表示方式。

我们开发那些应用和操作二叉树的程序时,最常用的具体表示法是内部节点带两个链接的结构(左链接与右链接)。这些结构与链表相似,但它们的每个节点有2个链接,而不是一个。空链接与外部节点对应。

定义二叉树的接口如下:
/* 节点结构定义*/
typedef struct node *link;
struct node{
    Item item;
    link l,r;
};

/* 常用操作定义*/
link NEW(Item item,link l,link r);
int count(link h);
int height(link h);
void preorderTraverse(link h,void (*visit)(link));
void printnode(char c,int h);
void show(link x,int h);

实现如下:
#include <stdio.h>
#include <stdlib.h>
#include "Tree.h"

/* construct a new node*/
link NEW(Item item,link l,link r)
{
    link x=(link)malloc(sizeof(*x));
    x->item=item;
    x->l=l;
    x->r=r;
    return x;
}

/* get the number of the nodes*/
int count(link h)
{
    if(h==NULL)
        return 0;
    return count(h->l)+count(h->r)+1;
}

/* get the height of the tree*/
int height(link h)
{
    int u,v;
    if(h==NULL)
        return -1;
    u=height(h->l);
    v=height(h->r);
    if(u>v)
        return u+1;
    else
        return v+1;
}

/* preorder traverse*/
void preorderTraverse(link h,void (*visit)(link))
{
    if(h==NULL)
        return;
    preorderTraverse(h->l,visit);
    preorderTraverse(h->r,visit);
}

/* print the tree node*/
void printnode(char c,int h)
{
    int i;
    for(i=0;i<h;i++)
        printf("  ");
    printf("%c/n",c);
}

/* print a subtree which root is x and in level h*/
void show(link x,int h)
{
    if(x==NULL)
    {
        printnode('*',h);
        return;
    }
    show(x->r,h+1);
    printnode(x->item,h);
    show(x->l,h+1);
}

二叉树的应用广泛,这里举几个例子。
构建锦标赛:
下面的程序将数组a[0],...,a[r]分成两部分a[0],...,a[m]和a[m+1],...,a[r],分别对这两部分构建锦标赛(按递归方式),在对整个数组生成一个锦标赛。
link max(Item a[],int l,int r)
{
    int m=(l+r)/2;                    // get the middle number
    Item u,v;
    link x=NEW(a[m],NULL,NULL);        // construct a new node
    if(l==r)                        // left equals to right means they are the same one
        return x;
    x->l=max(a,l,m);                // return max of the left part
    x->r=max(a,m+1,r);                // return max of the right part
    u=x->l->item;
    v=x->r->item;
    if(u>v)
        x->item=u;
    else
        x->item=v;
    //show(x,0);                        // print the tree
    printf("/n/n");
    return x;
}

构建解析树:
利用求前缀表达式值的同样策略,下面程序根据一个前缀表达式构建一颗解析树。为了简单起见,我们假定操作数为单个字符。每个递归调用创建一个新节点,它包含从输入(作为符号)获取的下一个字符。如果符号为操作数,则返回新节点;如果是一个运算符,则将左指针和右指针分别指向这两个参数(递归)生成的树。
char *a;int i;
typedef struct Tnode* link;
struct Tnode{
    char token;
    link l, r;
};

link NEW(char token,link l,link r)
{
    link x=(link)malloc(sizeof(*x));
    x->token=token;
    x->l=l;
    x->r=r;
    return x;
}

link parse()
{
    char t=a[i++];
    link x=NEW(t,NULL,NULL);
    if((t=='+')||(t=='*'))
    {
       x->l=parse();
       x->r=parse();
    }
    return x;
}

树的应用还有好多,关键在于我们要将问题抽象成数学模型,然后运用这些模型求解问题。当然,小问题可以不用编写程序来求解,但是面对大量复杂计算的时候我们就可以编制程序来求解它们。这时就要用到数据结构与算法的知识了。最好的情况是我们使用的语言足够灵活,并且能够处理各种各样的数据,比如大整数,浮点数,复数,等等。有些可以通过语言的其他方法实现,比如C中没有复数,我们可以通过定义复数类型并提供接口来实现复数的运算。总之,处理方法多种多样。在好的算法和数据结构的基础上,我们可以再对程序进行包装,做出人机界面,使程序更易于使用。

数据结构(栈,队列,链表,二叉树)

栈栈作为一种数据结构,用途十分广泛。在回调函数等许多场景中都有应用。我们需要了解它的基本用途,那就是先进后出和队列的先进先出正好相反。最近在学习数据结构和算法,于是自己来实现。我特别喜欢C语言的指针,...
  • u013766436
  • u013766436
  • 2016年05月04日 17:03
  • 1836

《数据结构》实验五:树和二叉树 实验(实验报告)

一.实验目的      巩固树和二叉树的相关知识,特别是二叉树的相关内容。学会运用灵活应用。 1.回树和二叉树的逻辑结构和存储方法,清楚掌握树和二叉树的遍历操作。 2.学习树的相关知...
  • denise94
  • denise94
  • 2014年12月06日 20:57
  • 3576

哈工大数据结构实验二 树形结构及其应用

实验二 树形结构及其应用 实验内容:树型结构的建立与遍历 树型结构的遍历是树型结构算法的基础,本实验要求编写程序演示二叉树的存储结构的建立和遍历过程。 实验要求: (1) 至少...
  • creazierHIT
  • creazierHIT
  • 2013年07月20日 02:13
  • 1193

数据结构二叉树接口实现

  • 2017年01月01日 23:32
  • 1.49MB
  • 下载

二叉树算法应用

  • 2015年12月29日 22:29
  • 820KB
  • 下载

数据结构,二叉树的应用

  • 2012年12月09日 22:15
  • 2KB
  • 下载

数据结构—赫夫曼二叉树的应用

  • 2011年07月01日 10:19
  • 90KB
  • 下载

二叉树的实现及模板的应用

  • 2010年04月14日 10:50
  • 679KB
  • 下载

HuffMan【二叉树、树和哈夫曼树及其应用】

  • 2016年05月13日 11:29
  • 10.95MB
  • 下载

数据结构有关数和二叉树,树的遍历以及线索化,Huffman树及其应用课件

  • 2010年03月11日 08:54
  • 554KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树接口及其应用
举报原因:
原因补充:

(最多只允许输入30个字)