【数据结构】遍历二叉树和线索二叉树

二叉树的遍历操作

前序(根)遍历

若二叉树为空,则空操作返回;否则:
①访问根结点;
②前序遍历根结点的左子树;
③前序遍历根结点的右子树。

中序(根)遍历

若二叉树为空,则空操作返回;否则:
①中序遍历根结点的左子树;
②访问根结点;
③中序遍历根结点的右子树。

后序(根)遍历

若二叉树为空,则空操作返回;否则:
①后序遍历根结点的左子树;
②后序遍历根结点的右子树。
③访问根结点;

层序遍历

二叉树的层次遍历是指从二叉树的第一层(即根结点)开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。

**若已知一棵二叉树的中序序列+ 前(或后)序序列,则可唯一的确定这棵二叉树。

遍历算法的递归实现

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

遍历算法的应用举例

  1. 统计二叉树中叶子结点的个数(先序遍历)
  2. 求二叉树的深度(后序遍历)
  3. 建立二叉树的存储结构
  4. 删除并释放二叉树中以元素值为x的结点作为根的各子树
  5. 求位于二叉树先序序列中第k个位置的结点的值

前/中/后缀表达式 与 二叉树 的对应关系

posted @ 2021-10-11 20:36  Mothlove  阅读(233)  评论(0)    收藏  举报