当前位置:主页 > 电脑教程 > 数据库 > 数据库综合

第四节 二叉树的遍历

时间:2010-08-18 | 栏目:数据库综合 | 点击:

第四节 二叉树的遍历

一、树的存储结构
 
 1.顺序存储结构
    将每个结点依次存放在一维数组中,用数组下标指示结点编号,编号的方法是从根结点开始编号1,然后由左而右进行连续编号。每个结点的信息包括
   ⑴ 一个数据域(data);
   ⑵ 三个指针域,其中有父结点编号(prt)、左儿子结点编号(lch)和右儿子结点编号(rch)。 满二叉树和完全二叉树一般采用顺序存储结构。

 

Const
  m=树中结点数上限;
Type
  node=record{结点类型}
        data:<数据类型>;{数据值}
        prt,lch,rch:0‥m; {父结点、左儿子、右儿子编号}
       end;
  treetype=array[1‥m] of node;{二叉树的顺序表类型}
Var
  Tree:treetype;{二叉树}

   2.链式存储结构
    对于一般的二叉树,通常采用链式分配,即用二重链表表示一般的二叉树。这种链式分配即可以采用静态数据结构(数组),又可以采用动态数据结构(指针)。如果二叉树的存储需求量超过64Kb,则采用后者。由于二叉树中每个结点通常包括数据元素和两个分支。因此二叉树对应的二重链表中每个结点应有三个域:
   ⑴ 值域: data
   ⑵ 左指针域:lch
   ⑶ 右指针域:rch
  这种链表也称为二叉链表。二叉链表头指针bt指向二叉树的根结点
 

 

Type
  bitrpetr=^node;{结点指针类型}
  node=record{结点类型}
        data:<数据类型>;{值域}
        lch,rch:bitreptr;{左指针域和右指针域}
       end;
Var
  bt:bitreptr;{头指针}

 

二、二叉树的遍历
    1.二叉树遍历的定义
    按照一定的规律不重复地访问(或取出结点中的信息,或对结点作其它的处理)二叉树中的每一个结点。
    2.二叉树遍历的顺序
    如果用L、D、R分别表示遍历左子树、访问根结点、遍历右子树,则对二叉树的遍历可以有下列六种(3!=6)组合:LDR、 LRD、 DLR、 DRL、RDL、 RLD。若再限定先左后右的次序,则只剩下三种组合:LDR(中序遍历)、LRD(后序遍历)、DLR(前序遍历)。

 
以下遍历以该树为例

三、前序遍历
    规则如下:
    若二叉树为空,则退出。否则
     ⑴ 访问处理根结点;
     ⑵ 前序遍历左子树;
     ⑶ 前序遍历右子树;

   如上图的前序遍历结果为 a b d e h i c f g

顺序结构:
Procedue preorder(i:integer);
 begin
  if i<>0
   then begin
    访问处理tree[i].data;
    preorder(tree[i].lch);{递归遍历左子树}
    preorder(tree[i].rch);{递归遍历右子树}
   end;
 end;

链式结构:
Procedue preorder(bt:bitreptr);
 begin
  if bt<>nil
     then begin
        访问处理bt^.data;
        preorder(bt^.lch);{递归遍历左子树}
        preorder(bt^.rch);{递归遍历右子树}
      end;
  end;

 

四、中序遍历
    规则如下:
    若二叉树为空,则退出;否则
    ⑴ 中序遍历左子树;
    ⑵ 访问处理根结点;
    ⑶ 中序遍历右子树;

    如上图的中序遍历结果为 d b h e i a f c g

顺序结构:
Procedue inorder(i:integer);
 begin
  if i<>0
   then begin
    inorder(tree[i].lch);{递归遍历左子树}
    访问处理tree[i].data;
    inorder(tree[i].rch);{递归遍历右子树}
   end;
 end;

链式结构:
Procedue inorder(bt:bitreptr);
 begin
  if bt<>nil
     then begin
        inorder(bt^.lch);{递归遍历左子树}
        访问处理bt^.data;
        inorder(bt^.rch);{递归遍历右子树}
      end;
  end;

 

五、后序遍历
    规则如下:
    若二叉树为空,则退出;否则
    ⑴ 后序遍历左子树;
    ⑵ 后序遍历右子树;
    ⑶ 访问处理根结点;

    如上图的后序遍历结果为 d h i e b f g c a

顺序结构:
Procedue postorder(i:integer);
begin
 if i<>0
  then begin
   postorder(tree[i].lch);{递归遍历左子树}
   postorder(tree[i].rch);{递归遍历右子树}
   访问处理tree[i].data;
  end;
end;

链式结构:
Procedue postorder(bt:bitreptr);
 begin
  if bt<>nil
     then begin
       postorder(bt^.lch);{递归遍历左子树}
       postorder(bt^.rch);{递归遍历右子树}
       访问处理bt^.data;
      end;
  end;

 

您可能感兴趣的文章:

相关文章