1. 遍历概念: 顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。
2. “访问”的含义很广,可以是对结点作各种处理, 如:输出结点的信息、修改结点的数据值等,但要求这种访问不破坏原来的数据结构。 (他是一个引用型操作)
- 遍历目的: 得到树中所有结点的一个线性排列。
4. 遍历方法:
DLR —— 先(根)序遍历,
LDR —— 中(根)序遍历,
LRD —— 后(根)序遍历。
练习:
1. 求先序序列ABCDEFGHI和中序序列BCAEDGHFI所确定的二叉树
2. 已知一颗二叉树后序序列为DABEC,中序序列为DEBAC,则先序序列为( )
A. ACBED B. DECAB C. DEABC D. CEDBA
课堂练习
1.二叉树的前序遍历序列中,任意一个结点均处在其子女结点的前面, 这种说法(A ) (A)正确 (B)错误
2.由于二叉树中每个结点的度最大为 2,所以二叉树是一种特殊的树,这种说法( B ) (A)正确 (B)错误
3.已知某二叉树的后序遍历序列是 dabec。中序遍历序列是 debac,它的前序遍历序列是( D )。
(A)acbed (B)decab(C)deabc (D)cedba
4.某二叉树的前序遍历结点访问顺序是 abdgcefh,中序遍历的结点访问顺序是 dgbaechf,则其后序遍历的结点访问顺序是( D )。
(A)bdgcefha (B)gdbecfha (C)bdgaechf (D)gdbehfca
5.在一非空二叉树的中序遍历序列中,根右边(A)
(A)只有右子树上的所有结点 (B)只有右子树上的部分结点
(C)只有左子树上的部分结点 (D)只有左子树上的所有结点
6.任一二叉树的叶子结点在先、中和后序遍历序列中的相对次序 ( A ) 。
(A)不发生改变 (B)发生改变 (C)不能确定 (D)以上都不对
线索二叉树:在线索树上进行遍历的方法:
1 、从序列中的第一个结点起,依次找后继,直至后继为空。
2 、从序列中的最后一个结点起,依次找前驱,直至前驱为空。
- 在线索化二叉树中,t 所指结点没有左子树的充要条件是(B)
(A)t -> lchild==NULL (B)t -> ltag==1(C)t -> ltag==1且t -> lchild==NULL
(D)以上都不对
二叉树按某种顺序线索化后,任一结点均有指向其前驱和后继的线索,这种说法(B) (A)正确 (B)错误
解析:只有空指针才能加线索,左指针指向前驱(遍历的第一个节点无前驱),右指针指向后继(遍历的最后一个节点无后继)
(考点)树和森林
树的存储结构
1 双亲表示法
实现:定义结构数组存放树的结点,每个结点含两个域:
数据域:存放结点本身信息。
双亲域:指示本结点的双亲结点在数组中的位置。
特点:找双亲容易,找孩子难。
2 孩子表示法(树的链式存储结构)
节约存储空间,但操作不方便
特点:找孩子容易,找双亲难。
3 孩子兄弟表示法(二叉树表示法,二叉链表表示法)
实现:用二叉链表作树的存储结构,链表中每个结点的两个指针域分别指向其第一个孩子结点和下一个兄弟结点
注意孩子兄弟链表的结构: 形式与二叉链表完全相同,但存储结点中指针的含义不同:二叉链表中结点的左右指针分别指向该结点的左右孩子;而孩子兄弟链表结点的左右指针分别指向它的“长子”和“大弟”。
结点结构:
typedef struct CSNode{
ElemType data;
struct CSNode *firstchild, *nextsibling;
} CSNode, *CSTree;