Java实现二叉树的前序、中序、后序遍(递归+非递归)

Java实现二叉树的前序、中序、后序遍(递归+非递归)

假设一个二叉树类为 BinaryNode

BinaryNode node = new BinaryNode();

左子节点:BinaryNode left = node.left;
右子节点:BinaryNode right = node.right;

节点所存值:node.element;

  • 递归方式:过于简单。

    • 前序

      public void preOrder( BinaryNode node ){
          if( node != null ){
              System.out.println(node.element + "");
              preOrder( node.left );
              preOrder( node.right );
          }
      }
      
    • 后序

      public void posOrder( BinaryNode node ){
          if( node != null ){
              posOrder( node.left );
              posOrder( node.right );
              System.out.println(node.element + "");
          }
      }
      
    • 中序

      public void midOrder( BinaryNode node ){
          if( node != null ){
              midOrder( node.left );
              System.out.println(node.element + "");
              midOrder( node.right );
          }
      }
      
  • 非递归方式

    • 前序

      • 由根节点开始依次读取每一个左子节点,每读取到一个左子节点(包括根节点 )直接输出;利用stack栈记录当前根节点用来遍历右节点。
      public void preOrder( BinaryNode node ){
          Stack<BinaryNode> stack = new Stack<>();
          while( node != null || !stack.empty() ){
              whilr( node != null ){
                  System.out.print(node.element + "");
                  stack.push( node ); //已经读取的入栈
                 	node = node.left;
              }
              while( !stack.empty() ){
                  node = stack.pop(); 
                  node = node.right;
              }
          }
      }
      
    • 后序:后序遍历,由根节点开始到每一个右自己单,依次排序必然为偏序结果的后面;

      • 图例:在这里插入图片描述

      • 后序遍历结果:D B E F C A;从结果看,A、C、F依次是根节点到每一个右节点,E则为右子树的一个左节;而左子树可以看正新的一个二叉树来看,理解是一样的。

      public void posOrder( BinaryNode node ){
          Stack<BinaryNode> stack1 = new Stack<>();  //记录节点,用以寻找左子树
          Stack<BinaryNode> stack2 = new Stack<>();  //用来存储实际遍历结束后的顺序
          
          while( node != null || !stack1.empty() ){
              //右节点,读完。
              while( node != null ){
                  stack1.push( node );
                  stack2.push( node );
                  node = node.right;
              }
              //找左子树的节点
              if( !stack1.empty() ){
                  node = stack1.pop();
                  node = node.left; //转向左子树
              }
              //打印结果
              while( !stack2.empty() ){
                  node = stack2.pop();
                  System.out.println(node.element+"");
              }
          }
      }
      
    • 中序

      public void posOrder( BinaryNode node ){
          Stack<BinaryNode> stack = new Stack<>();
          while( node != null || !stack.empty() ){
              whilr( node != null ){
                  stack.push( node ); //已经读取的入栈
                 	node = node.left;
              }
              while( !stack.empty() ){
                  node = stack.pop(); 
                  System.out.print(node.element + "");
                  node = node.right;
              }
          }
      }
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值