线索二叉树及二叉树的遍历.pptVIP

  • 14
  • 0
  • 约5.18千字
  • 约 24页
  • 2017-01-12 发布于江苏
  • 举报
线索二叉树及二叉树的遍历

6.3遍历二叉树和线索二叉树 6.3.1遍历二叉树 如果按某条搜索路径巡访树中每个结点,使得每个结点均被访问一次,而且仅被访问一次。 先序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)访问根结点; (2)先序遍历左子树; (3)先序遍历右子树。 A B C D F E G 先序遍历二叉树的递归算法 Status PreOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){ if (T){ if (Visit(T-data)) if (PreOrderTraverse(T-lchild,Visit)) if (PreOrderTraverse(T-rchild,Visit)) return OK; return ERROR; }else return OK; }//PreOrderTraverse 中序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)中序遍历左子树; (2)访问根结点; (3)中序遍历右子树。 C B D F A G E 中序遍历二叉树示例 中序遍历二叉树得: a+b*(c-d)-e/f 中序遍历二叉树的递归算法 Status InOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){ if (T){ if (InOrderTraverse(T-lchild,Visit)) if (Visit(T-data)) if (InOrderTraverse(T-rchild,Visit)) return OK; return ERROR; }else return OK; }//InOrderTraverse 后序遍历二叉树的操作定义为: 若二叉树为空,则空操作;否则 (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。 C F D B G E A 后序遍历二叉树的递归算法 Status PostOrderTraverse(BiTree T, Status(* Visit)(TElemType e)){ if (T){ if (PostOrderTraverse(T-lchild,Visit)) if (PostOrderTraverse(T-rchild,Visit)) if (Visit(T-data)) return OK; return ERROR; }else return OK; }//PostOrderTraverse 中序遍历二叉树的非递归算法 Status InOrderTraverse(BiTree T, Status(* Visit) (TElemType e)){ InitStack(S); Push(S,T); while(!StackEmpty(S)){ while(GetTop(S,p) p)Push(S,p-lchild); Pop(S, p); if (!StackEmpty(S)){ Pop(S,p); if (!Visite(p-data)) return ERROR; Push(S,p-rchild); } } return OK; }//InOrderTraverse 中序遍历二叉树的非递归算法 示意图 C B D F A G E 例: 已知结点的先序序列和中序序列,求整棵二叉树。 先序序列:A B C D E F G 中序序列:C B E D A F G 构造二叉链表表示的二叉树 的递归算法 Status CreateBiTree(BiTree T) { scanf(“%c”,ch); if (ch==‘#’) T=NULL; else { if (!(T=(BiTNode *) malloc(sizeof (BiTNode)))) exit(OVERFLOW); T-data = ch ; CreateBiTr

文档评论(0)

1亿VIP精品文档

相关文档