数据结构之二叉树遍历

来源:互联网 发布:ff14精灵男捏脸数据 编辑:程序博客网 时间:2024/05/21 10:48

1.递归的方法遍历

二叉树的顺序存储方式:

①先序遍历

 void PreTraverse(SqBiTree T,int e) {    VisitFunc(T[e]);   if(T[2*e+1]!=Nil) /* 左子树不空 */     PreTraverse(T,2*e+1);   if(T[2*e+2]!=Nil) /* 右子树不空 */     PreTraverse(T,2*e+2); }
②中序遍历

 void InTraverse(SqBiTree T,int e) {   if(T[2*e+1]!=Nil) /* 左子树不空 */     InTraverse(T,2*e+1);   VisitFunc(T[e]);   if(T[2*e+2]!=Nil) /* 右子树不空 */     InTraverse(T,2*e+2); }
③后续遍历

 void PostTraverse(SqBiTree T,int e) { /* PostOrderTraverse()调用 */   if(T[2*e+1]!=Nil) /* 左子树不空 */     PostTraverse(T,2*e+1);   if(T[2*e+2]!=Nil) /* 右子树不空 */     PostTraverse(T,2*e+2);   VisitFunc(T[e]); }
二叉树的链表存储:

①先序遍历

 void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType)) { /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数。算法6.1,有改动 */   /* 操作结果: 先序递归遍历T,对每个结点调用函数Visit一次且仅一次 */   if(T) /* T不空 */   {     Visit(T->data); /* 先访问根结点 */     PreOrderTraverse(T->lchild,Visit); /* 再先序遍历左子树 */     PreOrderTraverse(T->rchild,Visit); /* 最后先序遍历右子树 */   } }
②中序遍历

 void InOrderTraverse(BiTree T,Status(*Visit)(TElemType)) { /* 初始条件: 二叉树T存在,Visit是对结点操作的应用函数 */   /* 操作结果: 中序递归遍历T,对每个结点调用函数Visit一次且仅一次 */   if(T)   {     InOrderTraverse(T->lchild,Visit); /* 先中序遍历左子树 */     Visit(T->data); /* 再访问根结点 */     InOrderTraverse(T->rchild,Visit); /* 最后中序遍历右子树 */   } }