二叉树之先序遍历

墨蓝 2021-11-09 00:32 385阅读 0赞

  二叉树不同于列表、链表、栈、队列这些线性结构,也不同于图这种非线性结构,它属于半线性结构。我们在搞二叉树的时候不要从轮子造起,而要善于引用此前的工作成果,转化成以前已经玩烂的线性结构。

  根据树根、左娃、右娃的先后顺序,分别有先序遍历(V-L-R)、中序遍历(L-V-R)、后序遍历(L-R-V),说一个先序遍历就够了。

  先序遍历的递归实现方法:

  1. template <typename T,typename VST>
  2. void traverse(BinNodePosi(T) x,VST & visit){
  3. if(!x) return;
  4. visit(x->data);
  5. traverse(x->lChild,visit);
  6. traverse(x->rChild,visit);
  7. }

  先序遍历的迭代实现方法(栈)一:

  1. template <typename T,typename VST>
  2. void traverse(BinNodePosi(T) x,VST & visit){
  3. stack<BinNodePosi(T)> S; //辅助栈
  4. if(x) S.push(x); //根节点入栈
  5. while( !S.empty()){
  6. x=S.pop(); visit(x->data);
  7. if( hasRchild(x) ) S.push( x->rChild );
  8. if( hasLchild(x) ) S.push( x->lChild );
  9. }
  10. }

 示意图:

1705789-20190715085504484-775706869.png

  先序遍历的迭代实现方法(栈)二:

  1. template <typename T,typename VST>
  2. static void visitAlongLeftBranch(
  3. BinNodePosi(T) x,
  4. VST &visit,
  5. stack <BinNodePosi(T)> S)
  6. {
  7. while(x){
  8. visit(x->data);
  9. S.push(x->lChild);
  10. x=x->rChild;
  11. }
  12. }
  13. void traverse(BinNodePosi(T) x, VST &visit )
  14. {
  15. stack <BinNodePosi(T)> S;
  16. while(true){ //以右子树为单位,逐批访问节点
  17. visitAlongLeftBranch(x,visit,S); //访问子树x的左侧链,右子树入栈
  18. if(S.empty()) break;
  19. x=S.pop();
  20. }
  21. }

图示意:

1705789-20190715091030191-1122927413.png

转载于:https://www.cnblogs.com/dynmi/p/11186989.html

发表评论

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

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

相关阅读

    相关

    前两天面试,看见了个笔试题,关于二叉树的,今天算是把自己的一点理解写下来吧。 今天看网文,才想起来,二叉树的先序遍历、中序遍历、后序遍历, 遍历顺序都是

    相关

      二叉树不同于列表、链表、栈、队列这些线性结构,也不同于图这种非线性结构,它属于半线性结构。我们在搞二叉树的时候不要从轮子造起,而要善于引用此前的工作成果,转化成以前已经玩烂