所谓
遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是
二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。
从二叉树的
递归定义可知,一棵非空的二叉树由
根结点及左、右
子树这三个基本部分组成。因此,在任一给定结点上,可以按某种次序执行三个操作:
① NLR:
前序遍历(Preorder Traversal 亦称(先序遍历))
由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为
先根遍历、
中根遍历和
后根遍历。
除了先序
遍历、中序遍历、后序遍历外,还可以对二叉树进行
层序遍历。设二叉树的
根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。
⑴在搜索路线中,若访问结点均是第一次经过结点时进行的,则是
前序遍历;若访问结点均是在第二次(或第三次)经过结点时进行的,则是
中序遍历(或
后序遍历)。只要将搜索路线上所有在第一次、第二次和第三次经过的结点分别列表,即可分别得到该二叉树的前序序列、中序序列和后序序列。
⑵上述三种序列都是
线性序列,有且仅有一个开始结点和一个终端结点,其余结点都有且仅有一个前驱结点和一个后继结点。为了区别于
树形结构中前驱(即双亲)结点和后继(即孩子)结点的概念,对上述三种线性序列,要在某结点的前驱和后继之前冠以其遍历次序名称。
【例】上图所示的二叉树中结点C,其前序前驱结点是D,前序后继结点是E;中序前驱结点是E,中序后继结点是F;后序前驱结点是F,后序后继结点是A。但是就该树的逻辑结构而言,C的前驱结点是A,后继结点是E和F。
调用该算法时,应将待建立的二叉链表的根指针的地址作为
实参。
设
root是一根指针(即它的类型是BinTree),则调用CreateBinTree(&root)后root就指向了已构造好的二叉链表的
根结点。