【数据结构】遍历二叉树和线索二叉树
二叉树的遍历操作
前序(根)遍历
若二叉树为空,则空操作返回;否则:
①访问根结点;
②前序遍历根结点的左子树;
③前序遍历根结点的右子树。
中序(根)遍历
若二叉树为空,则空操作返回;否则:
①中序遍历根结点的左子树;
②访问根结点;
③中序遍历根结点的右子树。
后序(根)遍历
若二叉树为空,则空操作返回;否则:
①后序遍历根结点的左子树;
②后序遍历根结点的右子树。
③访问根结点;
层序遍历
二叉树的层次遍历是指从二叉树的第一层(即根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
**若已知一棵二叉树的中序序列+ 前(或后)序序列,则可唯一的确定这棵二叉树。
遍历算法的递归实现
void Preorder(BiTree T, void(*visit)(TElemType& e)) { if (T) { visit(T->data); // 访问结点 Preorder(T->lchild, visit); // 遍历左子树 Preorder(T->rchild, visit);// 遍历右子树 } }
遍历算法的非递归实现

void Preorder_I(BiTree T, void (*visit)(TelemType& e)) { Stack *S; initStack(S); t=T; while(!(t==NULL&&StackEmpty(S )) { while(t) { visit(t->data); push(S,t); t=t->lchild; } if (StackEmpty(S)) return; // 栈空时结束 else { t = Pop(S); t=t->rchild; } } // while }// Preorder_I

void Inorder_I(BiTree T, void (*visit)(TelemType& e)) { Stack *S; t=T; while(!(t==NULL&&StackEmpty(S )) { while(t) { push(S,t); t=t->lchild; } if (StackEmpty(S)) return; // 栈空时结束 else { t = Pop(S); visit(t->data); t=t->rchild; } } // while }// Inorder_I

void Postorder_I(BiTree T, void (*visit)(TelemType& e)) { Stack *S; t=T; while(!(t==NULL&&StackEmpty(S )) { if(t){ push(S,(t,1)); t=t->lchild;} else{ t=top(s). link; sign=top(s).tag; pop(s); if(sign==1){push(S,(t,2);t=t->rchild;) else{Visite(t->data); t=NULL; } } // while }// Postorder_I
遍历算法的应用举例
- 统计二叉树中叶子结点的个数(先序遍历)
- 求二叉树的深度(后序遍历)
- 建立二叉树的存储结构
- 删除并释放二叉树中以元素值为x的结点作为根的各子树
- 求位于二叉树先序序列中第k个位置的结点的值

浙公网安备 33010602011771号