数据结构——第三章树和二叉树:02二叉树

1.二叉树的存储结构:

(1)二叉树的顺序存储表示:

#define MAX_TREE_SIZE 100 //二叉树的最大结点数

typedef TElemType SqBiTree[MAX_TREE_SIZE]; 

SqBiTree bt;

(2)二叉树的链式存储表示:

①二叉链表:

typedef struct BiTNode //结点结构

{

  TElemType data;

  struct BiTNode *lchild, *rchild; //左右孩子指针

} BiTNode, *BiTree;

②三叉链表:如要找某个结点的父结点,在三叉链表中很容易实现,在二叉链表中则需从根指针出发一一查找。

typedef struct TriTNode //结点结构

{

  TElemType data;

  struct TriTNode *lchild, *rchild; //左右孩子指针

  struct TriTNode *parent; //双亲指针

} TriTNode, *TriTree;

③线索链表:

2.若一个二叉树中含有n个结点,则它的二叉链表中必含有2n个指针域,其中必有n + 1个空的链域。

证明:分支数目B = n - 1,即非空的链域有n - 1个,空链域有2n - (n - 1) = n + 1个。

3.二叉树的遍历:顺着某一条搜索路径巡防二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。对于二叉树可以有三条搜索路径:先上后下的按层次遍历;先左(子树)后右(子树)的遍历;先右子树后左子树的遍历。

(1)先左后右的遍历算法:递归操作

①先根遍历:若二叉树为空树,则空操作;否则,访问根结点->先序遍历左子树->先序遍历右子树。

先根遍历的递归算法描述:

void Preorder(BiTree T)

{

  if (T)

  {

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

    Preorder(T->lchild); //遍历左子树

    Preorder(T->rchild); //遍历右子树

  }

}

②中根遍历:若二叉树为空树,则空操作;否则,中序遍历左子树->访问根结点->中序遍历右子树。

③后根遍历:若二叉树为空树,则空操作;否则,后序遍历左子树->后序遍历右子树->访问根结点。

4.

5.

6.

7.

8.

9.

10.

猜你喜欢

转载自www.cnblogs.com/hou36/p/9903521.html
今日推荐