当前位置首页 > 百科资料> 正文

二叉链表

2022-07-14 00:25:02 百科资料

二叉链表是树的二叉链表实现方式。

  • 中文名称 二叉链表
  • 别名 左孩子右兄弟表示法
  • 适用领域 数据结构
  • 存储结构 二叉链表

简介

  树的二叉链表实现方式

  (孩子兄弟表示法)

  以二叉链表作为树的存储结构。链表中结点的两个链域分别指向该结点的第一个孩子结点和第二个孩子结点。

结构描述

  typedef struct CSNode{

  ElemType data;

  struct CSNode *firstchild , *netsibling;

  } CSNode,* CSTree;

  由于二叉树的存储结构比较简单,处理起来也比较方便,所以有时需要把复杂的树,转换为简单的二叉树后再作处理。

二叉链表的功能定义

  bitree.h

  //二叉链表定义

  #include <iostream>

  using namespace std;

  typedef char TElemType;

  struct BiTNode{

  TElemType data;

  BiTNode *lchild,*rchild;

  };

  typedef BiTNode *BiTree;

  void initBiTree(BiTree &T);

  void createBiTree(BiTree &T);

  void preOrderTraverse(BiTree T,void (*visit)(TElemType)); //递归前序遍历

  void preOrderTraverse1(BiTree T,void (*visit)(TElemType)); //非递归前序遍历

  void inOrderTraverse(BiTree T,void (*visit)(TElemType)); //递归中序遍历

  void postOrderTraverse(BiTree T,void (*visit)(TElemType)); //递归后序遍历

  void levelOrderTraverse(BiTree T,void (*visit)(TElemType)); //层序遍历

  bitree.cpp

  #include "bitree.h"

  void initBiTree(BiTree &T){ //构造空二叉树T

  T=NULL;

  }

  void createBiTree(BiTree &T){

  //按先序次序输入二叉树中结点的值('#'表示空格),构造二叉链表表示的二叉树T。

  TElemType ch;

  cin>>ch;

  if(ch=='#') // 空

  T=NULL;

  else{

  T=new BiTNode;

  if(!T)

  exit(1);

  T->data=ch; // 生成根结点

  createBiTree(T->lchild); // 构造左子树

  createBiTree(T->rchild); // 构造右子树

  }

  }

  void preOrderTraverse(BiTree T,void (*visit)(TElemType)){

  // 先序递归遍历T,对每个结点调用函数Visit一次且仅一次

  if(T){ // T不空

  visit(T->data); // 先访问根结点

  preOrderTraverse(T->lchild,visit); // 再先序遍历左子树

  preOrderTraverse(T->rchild,visit); // 最后先序遍历右子树

  }

  }

  void preOrderTraverse1(BiTree T,void (*visit)(TElemType)){

  //前序遍历二叉树T的非递归算法(利用栈),对每个数据元素调用函数Visit

  BiTree s[100];

  int top=0; //top为栈顶指针

  while((T!=NULL)||(top>0)){

  while(T!=NULL){

  visit(T->data);

  s[top++]=T;

  T=T->lchild;

  }

  T=s[--top];

  T=T->rchild;

  }

  }

  void inOrderTraverse(BiTree T,void (*visit)(TElemType)){

  //中序递归遍历T,对每个结点调用函数Visit一次且仅一次

  if(T){

  inOrderTraverse(T->lchild,visit); // 先中序遍历左子树

  visit(T->data); // 再访问根结点

  inOrderTraverse(T->rchild,visit); // 最后中序遍历右子树

  }

  }

  void postOrderTraverse(BiTree T,void (*visit)(TElemType)){

  //后序递归遍历T,对每个结点调用函数Visit一次且仅一次

  if(T){

  inOrderTraverse(T->lchild,visit); // 后序遍历左子树

  inOrderTraverse(T->rchild,visit); // 再后序遍历右子树

  visit(T->data); // 最后访问根结点

  }

  }

  void levelOrderTraverse(BiTree T,void (*visit)(TElemType)){

  //层序遍历T(利用队列),对每个结点调用函数Visit一次且仅一次

  BiTree q[100],p;

  int f,r; // f,r类似于头尾指针

  q[0]=T;

  f=0;

  r=1;

  while(f<r){

  p=q[f++]; //出队

  visit(p->data);

  if(p->lchild!=NULL)

  q[r++]=p->lchild; //入队

  if(p->rchild!=NULL)

  q[r++]=p->rchild; //入队

  }

  }

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:baisebaisebaise@yeah.net