遍历序列 遍历二叉树的执行蹤迹 三种递归遍历算法的搜索路线相同(如下图虚线所示) 具体线路为 从根结点出发逆时针沿着二叉树外缘移动对每个结点均途径三次最后回到根结点 遍历序列 () 中序序列 中序遍历二叉树时对结点的访问次序为中序序列 【例】中序遍历上图所示的二叉树时得到的中序序列为 D B A E C F () 先序序列 先序遍历二叉树时对结点的访问次序为先序序列 【例】先序遍历上图所示的二叉树时得到的先序序列为 A B D C E F () 后序序列 后序遍历二叉树时对结点的访问次序为后序序列 【例】后序遍历上图所示的二叉树时得到的后序序列为 D B E F C A 注意 () 在搜索路线中若访问结点均是第一次经过结点时进行的则是前序遍历;若访问结点均是在第二次(或第三次)经过结 点时进行的则是中序遍历(或后序遍历)只要将搜索路线上所有在第一次第二次和第三次经过的结点分别列表即可分别得到该 二叉树的前序序列中序序列和后序序列 () 上述三种序列都是线性序列有且仅有一个开始结点和一个终端结点其余结点都有且仅有一个前趋结点和一个后继结 点为了区别于树形结构中前趋(即双亲)结点和后继(即孩子)结点的概念对上述三种线性序列要在某结点的前趋和后继之前冠以 其遍历次序名称 【例】上图所示的二叉树中结点C其前序前趋结点是D前序后继结点是E;中序前趋结点是E中序后继结点是F;后序前趋结点是 F后序后继结点是A但是就该树的逻辑结构而言C的前趋结点是A后继结点是E和F 二叉链表的构造 基本思想 基于先序遍历的构造即以二叉树的先序序列为输入构造 注意 先序序列中必须加入虚结点以示空指针的位置 【例】 建立上图所示二叉树其输入的先序序列是ABD∮∮CE∮∮F∮∮ 构造算法 假设虚结点输入时以空格字符表示相应的构造算法为 void CreateBinTree (BinTree *T) { //构造二叉链表T是指向根指针的指针故修改*T就修改了实参(根指针)本身 char ch; if((ch=getchar())==) *T=NULL; //读人空格将相应指针置空 else{ //读人非空格 *T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点 (*T)>data=ch; CreateBinTree(&(*T)>lchild); //构造左子树 CreateBinTree(&(*T)>rchild); //构造右子树 } } 注意 调用该算法时应将待建立的二叉链表的根指针的地址作为实参 【例】 设root是一根指针(即它的类型是BinTree)则调用CreateBinTree(&root)后root就指向了已构造好的二叉链表的根结点 构造二叉链表的其他方法【参见参考书目】 二叉树建立过程见【 动画演示 】 二叉树的应用 【参见练习】 |