二叉链表的类型定义——教材101页

typedef struct btnode

{

  DataType data;

  struct btnode *lchild,*rchild;//指向左右孩子的指针

} *BinTree;

三叉链表的类型定义——教材102页

typedef struct ttnode

{

  DataType data;

  struct ttnode *lchild,*parent,*rchild;//在二叉链表的基础上多了一个 指向双亲的指针

} *TBinTree;

TBinTree root;

二叉链表的三种遍历的递归算法

1 先序遍历-根,左,右

void preorder(BinTree bt)

{

  if (bt != NULL)

  {

    visit (bt);//根

    preorder (bt->lchild);//左

    preorder (bt->rchild);//右

  }

}

2 中序遍历-左,根,右

void preorder(BinTree bt)

{

  if (bt != NULL)

  {    

    inorder (bt->lchild);//左

    visit (bt);

    inorder (bt->rchild);//右

  }

}

3 后序遍历-左,右,根

void postorder(BinTree bt)

{

  if (bt != NULL)

  {    

    postorder (bt->lchild);//左

    postorder (bt->rchild);//右

    visit (bt);//根

  }

}

利用二叉树遍历的递归算法,求二叉树的高度——教材106页

int Height(BinTree bt)

{

  int lh,rt;

  if (bt == NULL)

    return 0;

  else

    {

      lh=Height(bt->lchild);

      rh=Height(bt->rchild);

      return 1+(lh>rh ? lh : rh);

    }

}

二叉树的层次遍历

void lebelorder(BinTree bt)

{

  LkQue Q;

  InitQueue(&Q);//初始化队列

  if (bt != NULL)

    {

      EnQueue(&Q,bt);//根结点入队列

      while (!EmptyQueue(Q))

      {

        p=Gethead(&Q);

        outQueue(&Q);//结点出队列

        visit(p);//被访问结点

        if (p->lchild != NULL)  EnQueue(&Q,p->lchid);//左孩子结点入队列

        if (p->rchild != NULL)  EnQueue(&Q,p->rchid);//右孩子结点入队列

      }

    }

}

二叉树遍历的非递归实现

void PreOrder(BinTree t)

//非递归先序遍历二叉树

{

  BinTree p;

  LkStk *LS;//LS为指向链栈的指针

  if (t==NULL)  return;

  InitStack(LS);

  p=t;

  while (p !=NULL || !EmptyStack(LS))   //循环条件是当指针或栈至少有一个不为空  

  {

    if (p != NULL)

    {

      Visit(p->data);      //访问结点的数据

      Push(LS,p);      //将当前指针压入栈中

      p=p->lchild;      //将指针指向p的左孩子

    }

    else {

         p=Gettop(LS);  //取栈顶元素

         Pop(LS);     //出栈

         p=p->rchild;     //指针指向它的右孩子

       }

  }

}

应用举例

由先序序列和中序序列构造二叉树的算法

BinTree Create(char a[],char b[],int i,int j,int m,int n)

//数组a存储先序序列,i和j分别是数组a的下标的上、下界

//数组b存储中序序列,m和n分别是数组b的下标的上、下界

//函数返回由a[i]至a[j]的先序序列和b[m]至b[j]的中序序列的构成的构成的二叉树的根

 {

  int k;

  BinTree p;

  if (n<0) then return NULL;

  P=malloc(sizeof(BinTree));

  p->data=a[i];

  k=m;

  while ((k<=n) && (b[k] != a[i]))  k++;  //在中序列中找根

  if (k>n)  error();             //未找到根

  p->lchild=Create(a,b,i+1,i+k-m,m,k-1);  //递归构造左子树

  p->rchild=Create(a,b,i+k-m+1,j,k+1,n);  //递归构造右子树

  return p;//返回根结点指针

}

树的储存结构

1 孩子链表——教材112页

const int MAXND=20;//树中结点的最大个数

typedef struct bnode//表结点类型

{

  int child;

  struct bnode *next;

} node,*childlink;

typedef struct

{

  DataType data;

  childlink hp;

} headnode;

headnode link[MAXND]

2 带双亲的孩子链表

const int MAXND=20;//树中结点的最大个数

typedef struct bnode//表结点类型

{

  int child;

  struct bnode *next;

} node,*childlink;

typedef struct

{

  DataType data;

  int parent;

  childlink hp;

} headnode;

headnode link[MAXND]

3 孩子兄弟链表表示法

typedef struct tnode

{

  DataType data;

  struct tnode *son,*brother;

} *Tree;

4 双亲表示法

const int size=10;

typedef struct

{

  DataType data;

  int parent;

} Node;

Node slist [size];//用数组实现双亲表

 posted on 2021-06-05 09:47  HuJiao粉  阅读(48)  评论(0)    收藏  举报