由三个例题解释: 一、 已知先根次序访问序列:GFKDAIEBCHJ 后根次序访问序列:DIAEKFCJHBG,求树
先根次序访问=先序遍历 后根次序访问=后序遍历
先序遍历的规律是:根——左——右 中序遍历的规律是:左——根——右 后序遍历的规律是:左——右——根
可由先序遍历得到的先根序列GFKDAIEBCHJ得知G必定为根节点 而后在后根(后序)序列DIAEKFCJHBG中找到G,单独隔出 DIAEKFCJHB |G| 则G左侧都是它的子树节点 再继续看GFKDAIEBCHJ的G后面是F,可知F是G的下一个节点 在DIAEKFCJHB |G|中再隔出F DIAEK |F| CJHB |G| 则F左侧的都为F的子树节点 再继续看先根序列F后面是K,在后根序列中隔出K DIAE |K| |F| CJHB |G| 则K左侧都为K的子树节点 再继续看先根序列K后面为D,隔出D |D| IAE |K| |F| CJHB |G| D左侧没有节点了,可知D为一个叶子节点 继续看先根序列D后面是A,隔出A |D| I |A| E |K| |F| CJHB |G| A左侧的D已经判断过故无视,所以I是A的子树节点 故继续看先根序列可知I是A的子节点,而后的E同理可判断是K的另一个子节点 再继续看E后面是B,隔出 (省略K分支)CJH |B| |G| 可知左侧的CJH是B的子树节点 继续看先根序列B后面是C,隔出 |C| JH |B| |G| C左侧没有空余的节点了,故C是一个叶子节点 继续看C后面是H,隔出H |C| J |H| |B| |G| H左侧为J,故J是H的子节点 最后的J同理可知J为叶子节点 故得到树的图: 二、 已知先序序列为EBADCFHGIKJ 中序遍历为ABCDEFGHIJK
同样先看先序序列,可知E为根节点 在中序序列中隔出E,由中序遍历的规律得知子序列的推算往左右两侧进行 ABCD |E| FGHIJK 继续看先序序列,E后面为B,隔出B A |B| CD |E| FGHIJK 继续看先序序列往后的ADC都在中序序列中E的左侧,故可推出它们都是B的子树节点,且D为C的子节点,A、C为B的子节点,B分支推算完成 先序序列再继续往后是F,可知F为E的另一个子节点,隔出F (B分支省略)|F| GHIJK 可知右侧都为F的子节点 继续看先序序列F后为H,隔出H |F| G |H| IJK 可知再往后的GIKJ都是H的子树节点,以此类推可知J为K的子节点,K为I的子节点,I和G是H的子节点,F分支推算完成 最终得到树的图: (此处I下面漏了个K,应该是I——K——J的)
三、 已知中序序列为DCBGEAHFIJK 后序序列为DCEGBFHKJIA,求树
与二类似,但是条件为中序与后序序列,不过因为只要求树的图而不用考虑二叉树的左右子节点故所以实际上将后序序列倒着读就行
由后序序列DCEGBFHKJIA可知A必定为根节点,隔出A DCBGE |A| HFIJK 由于此时A在序列的中间,由中序遍历的规律得知子序列的推算往左右两侧进行 A左边是I,在中序序列DCBGEAHFIJK中隔出I DCBGE |A| HF |I| JK 可见I在A的右侧,是A的右子节点,故由I继续向两侧推算 可见后序序列中I左侧的FHKJ都在中序序列中A的右侧,故可直接推出它们都是I的子节点,且K为J的子节点,H为F的子节点,故F和J是I的子节点,I分支推算完成 从后序序列继续向左可知B是A的另一个子节点,B分支部分与I分支推算过程相同 最终得到的树图为: