遍历概念 所谓 遍历(Traversal) 是指沿着某条搜索路线依次对树中每个结点均做一次且仅做一次访问访问结点所做的操作依赖于 具体的应用问题 遍历是二叉树上最重要的运算之一是二叉树上进行其它运算之基础 遍历方案 遍历方案 从二叉树的递归定义可知一棵非空的二叉树由根结点及左右子树这三个基本部分组成因此在任一给定结点上可以按某 种次序执行三个操作 ()访问结点本身(N) ()遍历该结点的左子树(L) ()遍历该结点的右子树(R) 以上三种操作有六种执行次序 NLRLNRLRNNRLRNLRLN 注意 前三种次序与后三种次序对称故只讨论先左后右的前三种次序 三种遍历的命名 根据访问结点操作发生位置命名 ① NLR前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前 ② LNR中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间) ③ LRN后序遍历(PostorderTraversal) ——访问结点的操作发生在遍历其左右子树之后 注意 由于被访问的结点必是某子树的根所以N(Node)L(Left subtlee)和R(Right subtree)又可解释为根根的左子树和根的右子 树NLRLNR和LRN分别又称为先根遍历中根遍历和后根遍历 遍历算法 中序遍历的递归算法定义 若二叉树非空则依次执行如下操作 ()遍历左子树; ()访问根结点; ()遍历右子树 先序遍历的递归算法定义 若二叉树非空则依次执行如下操作 () 访问根结点; () 遍历左子树; () 遍历右子树 后序遍历得递归算法定义 若二叉树非空则依次执行如下操作 ()遍历左子树; ()遍历右子树; ()访问根结点 中序遍历的算法实现 用二叉链表做为存储结构中序遍历算法可描述为 void InOrder(BinTree T) { //算法里①~⑥是为了说明执行过程加入的标号 ① if(T) { // 如果二叉树非空 ② InOrder(T>lchild); ③ printf(%cT>data); // 访问结点 ④ InOrder(T>rchild); ⑤ } ⑥ } // InOrder |