一、二叉树的遍历
遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
层次遍历:
先序遍历非递归遍历:
1 void PreOrder1(BTNode *b) 2 { 3 BTNode *St[MaxSize], *p; 4 int top = -1; 5 ++top; 6 St[top] = b; 7 while (top != -1) 8 { 9 p = St[top]; 10 --top; 11 printf(" %c ", p->data); 12 if (p->rchild != NULL) 13 { 14 ++top; 15 St[top] = p->rchild; 16 } 17 if (p->lchild != NULL) 18 { 19 ++top; 20 St[top] = p->lchild; 21 } 22 } 23 }
先序遍历递归遍历:
1 void PreOrder(BTNode *b) 2 { 3 if (b != NULL) 4 { 5 printf(" %c ", b->data); 6 PreOrder(b->rchild); 7 PreOrder(b->lchild); 8 } 9 }
后序遍历非递归遍历:
1 void PostOrder(BTNode *b) 2 { 3 BTNode *St[MaxSize], *p; 4 int top = -1; 5 bool flag; 6 if (b != NULL) 7 { 8 do 9 { 10 while (b != NULL) 11 { 12 ++top; 13 St[top] = b; 14 b = b->lchild; 15 } 16 p = NULL; 17 flag = true; 18 19 while (top != -1 && flag) 20 { 21 b = St[top]; 22 if (b->rchild == p) 23 { 24 printf(" %c", b->data); 25 --top; 26 p = b; 27 } 28 else 29 { 30 b = b->rchild; 31 flag = false; 32 } 33 } 34 } 35 while (top != -1); 36 } 37 }
实现二叉树的各种遍历算法
【目的】:领会二叉树的各种遍历过程以及遍历算法设计
【内容】:编写一个程序,实现二叉树的先序遍历、中序遍历和后序遍历的递归过程和非递归算法,以及层次遍历的算法。
【来源】:《数据结构教程(第五版)》李春葆著,树和二叉树实验2。
求二叉树中从叶子节点到根节点的路径
【目的】:掌握二叉树遍历算法的运用,熟练使用先序、中序、后序3种递归和非递归遍历算法以及层次遍历算法进行二叉树问题的求解。
【内容】:编写一个程序,实现如下功能:
1. 采用先序遍历方法输出所有从叶子节点到根节点的逆路径。
2. 采用先序遍历方法输出第一条最长的逆路径。
3. 采用后序非递归遍历方法输出所有从叶子节点到根节点的逆路径。
4. 采用层次遍历方法输出所有从从叶子节点到根节点的逆路径。
【来源】:《数据结构教程(第五版)》李春葆著,树和二叉树实验2。