遍历二叉树和线索二叉树遍历二叉树和线索二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树遍历二叉树––按某种路径按某种路径((或策略或策略))访问二叉树中的每个结访问二叉树中的每个结点,且对每个结点只访问一次。这样,二点,且对每个结点只访问一次。这样,二每个次样每个次样叉树中的结点按被访问顺序形成一个线性叉树中的结点按被访问顺序形成一个线性序列。序列。––用于信息查询或逐一处理,是二叉树大部用于信息查询或逐一处理,是二叉树大部分其他操作的基础分其他操作的基础分其他操作的基础分其他操作的基础遍历二叉树遍历二叉树遍历二叉树遍历二叉树二叉树的三个基本单元二叉树的三个基本单元––根结点、左子树、右子树根结点、左子树、右子树D符号约定符号约定––LL:表示遍历左子树:表示遍历左子树LR––DD:表示访问根结点:表示访问根结点––RR:表示遍历右子树:表示遍历右子树树的能遍序树的能遍序对二叉树的可能遍历顺序对二叉树的可能遍历顺序–DLR,LDR,LRD,DRL,RDL,RLD六种若定先左则有种–若限定先左后右,则有DLR,LDR,LRD三种,分别称之为先序遍历,中序遍历和后序遍历,形成先序序列,中序序列和后序序列列,中序序列和后序序列遍历叉树的操作遍历叉树的操作遍历二叉树的操作遍历二叉树的操作先序遍历二叉树先序遍历二叉树((PreOrderTraversePreOrderTraverse))先序遍历二叉树先序遍历二叉树((PreOrderTraversePreOrderTraverse))––访问根结点访问根结点先序遍历左子树先序遍历左子树––先序遍历左子树先序遍历左子树––先序遍历右子树先序遍历右子树中序遍历二叉树中序遍历二叉树((InOrderTraverseInOrderTraverse))中序遍历二叉树中序遍历二叉树((InOrderTraverseInOrderTraverse))––中序遍历左子树中序遍历左子树访问根结点访问根结点––访问根结点访问根结点––中序遍历右子树中序遍历右子树后序遍历二叉树后序遍历二叉树((PostOrderTraversePostOrderTraverse))后序遍历二叉树后序遍历二叉树((PostOrderTraversePostOrderTraverse))––后序遍历左子树后序遍历左子树––后序遍历右子树后序遍历右子树后序遍历右子树后序遍历右子树––访问根结点访问根结点先序遍历:ADLR先序遍历:AADLRDLRDBCDLRDLRDDLRBCD先序遍历序列:ABDC中序遍历:ALDR中序遍历:ALDRADBCLDRLDRDBLDRCD中序遍历序列:BDAC后序遍历:ALRD后序遍历:ALRDALRDDBCLRDLRDDLRDCBDD后序遍历序列:DBCA-+/a*efb-dcd先序遍历:中序遍历-+a*b-cd/ef+a*bcd/ef中序遍历:后序遍历:-+a*b-cd/ef-+a*b-cd/ef层次遍历:-+a*b-cd/ef遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作A先序序列:ABCABC先序序列中序序列:BAC后序序列:BCAA先序序列:ABDCEFGH中序序列:DBAFEGCH后序序列DBFGEHCABDCEH后序序列:DBFGEHCAGF遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作-+/a*efb-d先序序列:+a*bcd/ef(前缀表达式)cd先序序列:-+a*b-cd/ef(前缀表达式)中序序列:a+b*c-d-e/f(中缀表达式)后序序列:abcd-*+ef/-(后缀表达式)后(后缀式)遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作先序序列:中序序列AB中序序列:后序序列:CDEFGAB先序序列:BCD先序序列:中序序列:后序序列:D遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作遍历二叉树的操作先序序列:ABCDEGF中序序列CBEGDFAAB中序序列:CBEGDFA后序序列:CGEFDBACDEFGAB先序序列:ABCDBCD先序序列:ABCD中序序列:DCBA后序序列:DCBADMakeaBTuniquelybypreorderandinorderEld{ABHFDECKG}Example:preorder{ABHFDECKG}andinorder{HBDFAEKCG},makeaBT:遍历二叉树的算法遍历二叉树的算法遍历二叉树的算法遍历二叉树的算法算法实现算法实现––递归实现递归实现递归实现递归实现––非递归实现非递归实现叉树的存储结构叉树的存储结构二叉树的存储结构二叉树的存储结构––采用二叉链表结构采用二叉链表结构采构采构typedefstructBiTNode{TElemTypedata;structBiTNode*lchild,*rchild;}BiTNode*BiTree;}BiTNode,*BiTree;BiTreeT;遍历二叉树的递归算法遍历二叉树的递归算法遍历二叉树的递归算法遍历二叉树的递归算法voidPreOrderTraverse(BiTreeT){voidPreOrderTraverse(BiTreeT){//先序遍历的递归实现if(T){如visit(T);//如打印T-dataPreOrderTraverse(T-lchild);PreOrderTraverse(Trchild);PreOrderTraverse(T-rchild);}}}voidPreOrderTraverse(BiTreeT){if(T!=NULL)AA{if(T!=NULL){printf(%d\t,T-data);PreOrderTraverse(T-lchild);CBBC左是空返回左是空返回();PreOrderTraverse(T-rchild);}DD返回T左是空返回右是空返回}TBprintf(B);TATD返回T左是空返回右是空返回主程序返回printf(B);pre(TL);TAprintf(A);pre(TL);printf(D);pre(TL);pre(TR);TPre(T)返回pre(TR);pre(TL);TCp();TTpre(TR);pre(TR);返回printf(C);pre(TL);TT先序序列:ABDCpre(TR);返回T遍历二叉树的递归算法遍历二叉树的递归算法遍历二叉树的递归算法遍历二叉树的递归算法voidInOrderTraverse(BiTreeT){voidInOrderTraverse(BiTreeT){//中序遍历的递归实现if(T){InOrderTraverse(T-lchild);visit(T);//如打印T-dataInOrderTraverse(Trchild);InOrderTraverse(T-rchild);}}}非递归算法pApABpBCDBCDiP-BEFiP-AEFGP-AP-B(2)G(1)G()ABpiABCDEFP-BP-Cp=NULLCDEFiP-BEFGP-A(3)pNULLEFGP-A访问:C(4)pAABCDBipCDEFiP-ACDEFiP-AP-DG访问:CB(5)G访问:CB(6)AABCDiP-EBiCDEFP-AP-DpCDEFiP-AP-DG访问:CB(7)G访问:CBEp(8)AABiP-GABiCDEFP-AP-DPGCDEFiP-AP-DG访问:CBEP=NULL(9)GPA访问:CBEG(10)PNULLAApBpBCDipCDEFiP-ACDEFP-AP-FG访问:CBEGD(11)G访问:CBEGD(12)中序遍历二叉树的非递归算法1StatusInOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee)){InitStack(S);Push(S,T);//根指针进栈While(!StackEmpty(S)){(py()){while(GetTop(S,p)&&p)Push(S,p-lchild);//向左走到尽头pop(Sp);//空指针退栈pop(S,p);//空指针退栈if(!StackEmpty(S)){//访问结点,向右一步P(S)if(!Viit(dt))tERRORPop(S,p);if(!Visit(p-data))returnERROR;Push(S,p-rchild);}//if}//whileReturnOK;}中序遍历二叉树的非递归算法2SttIOdT(BiTTStt(*Viit)(TElT)){StatusInOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee)){InitStack(S);p=t;While(p||!StackEmpty(S){if(p){Push(Sp);p=plchild;}//根指针进栈遍历左子树if(p){Push(S,p);p=p-lchild;}//根指针进栈,遍历左子树else{//根指针退栈,访问根结点,遍历右子树Pop(S,p);p=p-rchild;pprchild;}//else}//whilereturnOK;;}遍历二叉树的递归算法遍历二叉树的递归算法遍历二叉树的递归算法遍历二叉树的递归算法voidPostOrderTraverse(BiTreeT){voidPostOrderTraverse(BiTreeT){//后序遍历的递归实现if(T){PostOrderTraverse(T-lchild);PostOrderTraverse(T-rchild);visit(T);//如打印Tdatavisit(T);//如打印T-data}}}按先序序列建立二叉树的算法按先序序列建立二叉树的算法按先序序列建立二叉树的算法按先序序列建立二叉树的算法StatusCreateBiTree(BiTree&T){SusCeeee(ee&){//按先序次序输入二叉树中的结点值(一个字符),//空格表示空树,//构造二叉链表表示的二叉树T//构造二叉链表表示的二叉树Tscanf(&ch);if(ch==‘’)T=NULL;else{if(!(T=(BiTNode*)malloc(sizeof(BiTNode))))it(OVERFLOW)exit(OVERFLOW);T-data=ch;CreateBiTree(T-lchild);CreateBiTree(Tlchild);CreateBiTree(T-rchild);}returnOK;}按先序序列建立二叉树的算法按先序序列建立二叉树的算法按先序序列建立二叉树的算法按先序序列建立二叉树的算法输入输入ABC__DE_G__F___ABC__DE_G__F___生成的二叉树及其存储结构为生成的二叉树及其存储结构为生成的二叉树及其存储结构为生成的二叉树及其存储结构为TABCDATCDEFBCDGCDEFG按先序序列建立二叉树的算法按先序序列建立二叉树的算法按先序序列建立二叉树的算法按先序序列建立二叉树的算法若希望建立如下二叉树对应的存储结构,应若希望建立如下二叉树对应的存储结构,应输入的字符序列是输入的字符序列是输入的字符序列是输入的字符序列是-+/*fa*efb-cd输入:-+a__*b__-c__d__/e__f__几个问答几个问答几个问答几个问答具有具有nn个结点的不同形态的二叉树有多少棵?个结点的不同形态的二叉树有多少棵?具有具有nn个结点的不同形态的二叉树有多少棵?个结点的不同形态的二叉树有多少棵?––有有棵,如棵,如n=3n=3时,有时,有55种不同形态种不同形态cnnn211已知结点先序序列和中序序列,是否可以唯一地确已知结点先序序列和中序序列,是否可以唯一地确定一棵二叉树?定一棵二叉树?––能,如先序序列能,如先序序列ABCDEFGABCDEFG,中序序列,中序序列CBEDAF