树的遍历(先中后序,非递归,层次遍历)

柔情只为你懂 2022-06-09 01:12 227阅读 0赞

树的遍历分为先序遍历,中序遍历以及后续遍历。其中分为递归形式与非递归形式,及层次遍历。

先序遍历:

首先访问根节点,然后访问左子树,最后访问右子树。

  1. void PreOrder(BiTree T)
  2. {
  3. if(p)
  4. {
  5. visit(p);
  6. PreOrder(p->lchild);
  7. PreOrder(p->rchild);
  8. }
  9. }

中序遍历:

首先访问左子树,然后访问根节点,最后访问右子树。

  1. void InOrder(BiTree T)
  2. {
  3. if(p)
  4. {
  5. InOrder(p->lchild);
  6. visit(p);
  7. InOrder(p->rchild);
  8. }
  9. }

后序遍历:

首先访问左子树,然后访问右子树,最后访问根节点。

  1. void InOrder(BiTree T)
  2. {
  3. if(p)
  4. {
  5. PostOrder(p->lchild);
  6. PostOrder(p->rchild);
  7. visit(p);
  8. }
  9. }

以上三种都是递归形式,下面说一下非递归形式的中序遍历。这里采用了栈:

  1. void InOrder2(BiTree T)
  2. {
  3. InitStack(S);
  4. BiTree p = T;
  5. while(p || ! isEmpty(S))
  6. {
  7. if(p)
  8. {
  9. Push(S,p);
  10. p = p->lchild;
  11. }
  12. else
  13. {
  14. Pop(S,p);
  15. visit(p);
  16. p = p->rchild;
  17. }
  18. }
  19. }

层次遍历:

就是将节点一层一层的输出,这里利用了队列:

  1. void levelOrder(BiTree T)
  2. {
  3. InitQueue(Q);
  4. BiTree p = T;
  5. EnQueue(Q,p);
  6. while(p || !isEmpty(Q))
  7. {
  8. DeQueue(Q,p);
  9. visit(p);
  10. if(p->lchild)
  11. EnQueue(Q,p->lchild);
  12. if(p->rchild)
  13. EnQueue(Q,p->rchild);
  14. }
  15. }

发表评论

表情:
评论列表 (有 0 条评论,227人围观)

还没有评论,来说两句吧...

相关阅读