二叉链表相关遍历操作.docVIP

  • 3
  • 0
  • 约2.53千字
  • 约 4页
  • 2018-11-23 发布于河南
  • 举报
二叉链表相关遍历操作

二叉链表相关遍历操作 bool CreateBiTree(BiTree * T) { char ch; ch=getchar(); if (ch==#) *T=NULL; else { if(!(*T=(BiTree)malloc(sizeof(BiTNode)))) exit (1); (*T)-data=ch; CreateBiTree(((*T)-lchild)); CreateBiTree(((*T)-rchild)); } return true; }//创建二叉链表 bool Preorder(BiTree T) { if (T!=NULL) { printf(%c ,T-data);//访问根结点 Preorder(T-lchild); //先序遍历根的左子树 Preorder(T-rchild); //先序遍历根的右子树 } return true; }//前序遍历二叉链表递归算法 bool Inorder(BiTree T) { if (T!=NULL) { Inorder(T-lchild); //中序遍历根的左子树 printf(%c ,T-data); //访问根结点 Inorder(T-rchild); //中序遍历根的右子数 } return true; }中序遍历二叉链表递归算法 bool Postorder(BiTree T) { if (T!=NULL) { Inorder(T-lchild); //后序遍历根的左子树 Inorder(T-rchild); //后序遍历根的右子树 printf(%c ,T-data); //访问根结点 } return true; }//后序遍历二叉链表递归算法 bool PreOrderTraverse (BiTree T,Status (*visit)(TElemType e)) { BiTree P; P=T; SqStack S; InitStack(S); while (P || (!StackEmpty(S)))//二叉树未处理完 { if (P) //当前未遇到空结点 { if (!visit(P-data)) //访问当前子树根结点 return false; Push(S,P);//节点压栈 P=P-lchild; //继续向左子树前进 } else { Pop(S,P); P=P-rchild; //弹出栈顶结点处理其右子数 } } return true; } bool InorderTraverse(BiTree T,Status(*visit)(TElemType e)) { BiTree p; p=T; SqStack S; InitStack(S); while ( p || !StackEmpty(S) ) { if (p) //未达到左子树末端 { Push(S,p); //当前节点压栈 p=p-lchild; //继续向左子树前进 } else //已到达左子树末端 { Pop(S,p); if(!visit(p-data)) return false; p=p-rchild; //向右子树前进 } } return true; } bool PostorderTraverse(BiTree T,Status(* visit)(TElemType e)) { BiTree p,temp,astvist; BiTree lastvisit=NULL; p=T; SqStack S; InitStack(S); while(p||S.top!=S.base) { while(p) { Push(S,p); p=p-lchild; } GetTop(S,temp); if(temp-rchild==NULL||temp-rchild==lastvisit) { if(!visit(temp-data)) retur

文档评论(0)

1亿VIP精品文档

相关文档