数据结构二叉树(四)
层次遍历过程
若二叉树非空(假设其高度为h),则层次遍历的过程如下:
① 访问根结点(第1层)。
② 从左到右访问第2层的所有结点。
③ 从左到右访问第3层的所有结点、…、第h层的所有结点。
层次遍历算法设计
在二叉树层次遍历中,对一层的结点访问完后,再按照它们的访问次序对各个结点的左、右孩子顺序访问,这样一层一层进行,先访问的结点其左、右孩子也要先访问,这样与队列的先进先出特点吻合。因此层次遍历算法采用一个队列qu来实现。
思路:先将根结点b进队,在队不空时循环:从队列中出队一个结点p,访问它;若它有左孩子结点,将左孩子结点进队;若它有左孩子结点,将左孩子结点进队。如此操作直到队空为止。
由先序/中序序列或后序/中序序列构造二叉树
一棵所有结点值不同的二叉树,其先序、中序、后序和层次遍历都是唯一的,也就是说一棵这样的二叉树,不可以有两种不同的先序遍历序列,也不可能有两种不同的中序序列。
二叉树的构造就是给定某些遍历序列,反过来唯一地确定该二叉树。
从中看到,对于不同形态的二叉树:
先序遍历序列可能相同(图中5棵二叉树的先序遍历序列均相同)。
中序遍历序列可能相同。
后序遍历序列可能相同(图(b)~(e)的后序遍历序列均相同)
先序遍历序列和后序遍历序列可能都相同(图(d)和(e)的先序遍历序列和后序遍历序列均相同)。
实际上,对于含2个或者以上结点的二叉树,在先序、中序和后序遍历序列中:
由先序遍历序列和中序遍历序列能够唯一确定一棵二叉树。
由后序遍历序列和中序遍历序列能够唯一确定一棵二叉树。
由先序遍历序列和后序遍历序列不能唯一确定一棵二叉树。
定理6.1 任何n(n≥0)个不同结点的二又树,都可由它的中序序列b和先序序列a唯一地确定。
由a0(根结点)找到bk。
若bk前面有k个结点,则左子树有k个结点,右子树有n-k-1个结点。
可以求出左右子树的中序序列和先序序列。
这样根结点是确定的,左右子树也是确定的,则该二叉树是确定的。
已知先序序列为ABDGCEF,中序序列为DGBAECF,则构造二叉树的过程:
定理6.2 任何n(n≥0)个不同结点的二叉树,都可由它的中序序列和后序序列唯一地确定。
由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
则L和R均为空。所以满足条件的二叉树只有一个根结点。
序列化和反序列化
仅仅讨论先序遍历序列化和反序列化。