vlambda博客
学习文章列表

数据结构二叉树(四)

层次遍历过程

若二叉树非空(假设其高度为h),则层次遍历的过程如下:

① 访问根结点(第1层)。

② 从左到右访问第2层的所有结点。

③ 从左到右访问第3层的所有结点、…、第h层的所有结点。

层次遍历算法设计

在二叉树层次遍历中,对一层的结点访问完后,再按照它们的访问次序对各个结点的左、右孩子顺序访问,这样一层一层进行,先访问的结点其左、右孩子也要先访问,这样与队列的先进先出特点吻合。因此层次遍历算法采用一个队列qu来实现。

思路:先将根结点b进队,在队不空时循环:从队列中出队一个结点p,访问它;若它有左孩子结点,将左孩子结点进队;若它有左孩子结点,将左孩子结点进队。如此操作直到队空为止。

数据结构二叉树(四)

由先序/中序序列或后序/中序序列构造二叉树

一棵所有结点值不同的二叉树,其先序、中序、后序和层次遍历都是唯一的,也就是说一棵这样的二叉树,不可以有两种不同的先序遍历序列,也不可能有两种不同的中序序列。

二叉树的构造就是给定某些遍历序列,反过来唯一地确定该二叉树。

数据结构二叉树(四)

从中看到,对于不同形态的二叉树:

先序遍历序列可能相同(图中5棵二叉树的先序遍历序列均相同)。

中序遍历序列可能相同。

后序遍历序列可能相同(图(b)~(e)的后序遍历序列均相同)

先序遍历序列和后序遍历序列可能都相同(图(d)和(e)的先序遍历序列和后序遍历序列均相同)。

数据结构二叉树(四)

实际上,对于含2个或者以上结点的二叉树,在先序、中序和后序遍历序列中:

由先序遍历序列和中序遍历序列能够唯一确定一棵二叉树。

由后序遍历序列和中序遍历序列能够唯一确定一棵二叉树。

由先序遍历序列和后序遍历序列不能唯一确定一棵二叉树。


定理6.1 任何nn≥0)个不同结点的二又树,都可由它的中序序列b和先序序列a唯一地确定。

a0(根结点)找到bk

数据结构二叉树(四)

若bk前面有k个结点,则左子树有k个结点,右子树有n-k-1个结点。

可以求出左右子树的中序序列和先序序列。

这样根结点是确定的,左右子树也是确定的,则该二叉树是确定的。



已知先序序列为ABDGCEF,中序序列为DGBAECF,则构造二叉树的过程:

数据结构二叉树(四)

数据结构二叉树(四)

数据结构二叉树(四)

定理6.2 任何nn0)个不同结点的二叉树,都可由它的中序序列和后序序列唯一地确定。

an-1(根结点)找到bk

数据结构二叉树(四)

若bk前面有k个结点,则左子树有k个结点,右子树有n-k-1个结点。

可以求出左右子树的中序序列和后序序列。

这样根结点是确定的,左右子树也是确定的,则该二叉树是确定的。



已知中序序列为DGBAECF,后序序列为GDBEFCA,则构造二叉树的过程


数据结构二叉树(四)

数据结构二叉树(四)

由后序序列posts[i..i+n-1]和中序序列ins[j..j+n-1]创建二叉链t

数据结构二叉树(四)

若某非空二叉树的先序序列和后序序列正好相同,则该二叉树的形态是什么?

二叉树的先序序列是NLR,后序序列是LRN

N L R = L R N

LR均为空。所以满足条件的二叉树只有一个根结点。



序列化和反序列化

仅仅讨论先序遍历序列化和反序列化。

数据结构二叉树(四)

数据结构二叉树(四)

数据结构二叉树(四)