Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 543|回复: 0

[算法学习]二叉树的递归与非递归遍历

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-14 00:08:31 | 显示全部楼层 |阅读模式
    构造树如下:

    其中二叉树节点类
      
         
         
          /** 二叉树节点 */
          

          public
          
          class
           BTNode {
         
          private
          
          char
           key;
         
          private
           BTNode left, right;

         
          public
           BTNode(
          char
           key) {
             
          this
          (key,
          null
          ,
          null
          );
         }

         
          public
           BTNode(
          char
           key, BTNode left, BTNode right) {
             
          this
          .key = key;
             
          this
          .left = left;
             
          this
          .right = right;
         }

         
          public
          
          char
           getKey() {
             
          return
           key;
         }

         
          public
          
          void
           setKey(
          char
           key) {
             
          this
          .key = key;
         }

         
          public
           BTNode getLeft() {
             
          return
           left;
         }

         
          public
          
          void
           setLeft(BTNode left) {
             
          this
          .left = left;
         }

         
          public
           BTNode getRight() {
             
          return
           right;
         }

         
          public
          
          void
           setRight(BTNode right) {
             
          this
          .right = right;
         }
    }
          
         
       
    遍历二叉树
      
         
         
          /** 二叉树遍历 */
          

          public
          
          class
           BinTree {
         
          protected
           BTNode root;

         
          public
           BinTree(BTNode root) {
             
          this
          .root = root;
         }

         
          public
           BTNode getRoot() {
             
          return
           root;
         }

         
          /** 构造树 */
          
         
          public
          
          static
           BTNode init() {
             BTNode a =
          new
           BTNode("A");
             BTNode b =
          new
           BTNode("B",
          null
          , a);
             BTNode c =
          new
           BTNode("C");
             BTNode d =
          new
           BTNode("D", b, c);
             BTNode e =
          new
           BTNode("E");
             BTNode f =
          new
           BTNode("F", e,
          null
          );
             BTNode g =
          new
           BTNode("G",
          null
          , f);
             BTNode h =
          new
           BTNode("H", d, g);
             
          return
           h;
          // root
          
         }

         
          /** 访问节点 */
          
         
          public
          
          static
          
          void
           visit(BTNode p) {
             System.out.print(p.getKey() +
          " "
          );
         }

         
          /** 递归实现前序遍历 */
          
         
          protected
          
          static
          
          void
           preorder(BTNode p) {
             
          if
           (p !=
          null
          ) {
                 visit(p);
                 preorder(p.getLeft());
                 preorder(p.getRight());
             }
         }

         
          /** 递归实现中序遍历 */
          
         
          protected
          
          static
          
          void
           inorder(BTNode p) {
             
          if
           (p !=
          null
          ) {
                 inorder(p.getLeft());
                 visit(p);
                 inorder(p.getRight());
             }
         }

         
          /** 递归实现后序遍历 */
          
         
          protected
          
          static
          
          void
           postorder(BTNode p) {
             
          if
           (p !=
          null
          ) {
                 postorder(p.getLeft());
                 postorder(p.getRight());
                 visit(p);
             }
         }

         
          /** 非递归实现前序遍历 */
          
         
          protected
          
          static
          
          void
           iterativePreorder(BTNode p) {
             Stack<BTNode> stack =
          new
           Stack<BTNode>();
             
          if
           (p !=
          null
          ) {
                 stack.push(p);
                
          while
           (!stack.empty()) {
                     p = stack.pop();
                     visit(p);
                     
          if
           (p.getRight() !=
          null
          )
                         stack.push(p.getRight());
                     
          if
           (p.getLeft() !=
          null
          )
                         stack.push(p.getLeft());
                 }
             }
         }

         
          /** 非递归实现后序遍历 */
          
         
          protected
          
          static
          
          void
           iterativePostorder(BTNode p) {
             BTNode q = p;
             Stack<BTNode> stack =
          new
           Stack<BTNode>();
             
          while
           (p !=
          null
          ) {
                
          // 左子树入栈
          
                
          for
           (; p.getLeft() !=
          null
          ; p = p.getLeft())
                     stack.push(p);
                
          // 当前节点无右子或右子已经输出
          
                
          while
           (p !=
          null
           && (p.getRight() ==
          null
           || p.getRight() == q)) {
                     visit(p);
                     q = p;
          // 记录上一个已输出节点
          
                     
          if
           (stack.empty())
                         
          return
          ;
                     p = stack.pop();
                 }
                
          // 处理右子
          
                 stack.push(p);
                 p = p.getRight();
             }
         }

         
          /** 非递归实现中序遍历 */
          
         
          protected
          
          static
          
          void
           iterativeInorder(BTNode p) {
             Stack<BTNode> stack =
          new
           Stack<BTNode>();
             
          while
           (p !=
          null
          ) {
                
          while
           (p !=
          null
          ) {
                     
          if
           (p.getRight() !=
          null
          )
                         stack.push(p.getRight());
          // 当前节点右子入栈
          
                     stack.push(p);
          // 当前节点入栈
          
                     p = p.getLeft();
                 }
                 p = stack.pop();
                
          while
           (!stack.empty() && p.getRight() ==
          null
          ) {
                     visit(p);
                     p = stack.pop();
                 }
                 visit(p);
                
          if
           (!stack.empty())
                     p = stack.pop();
                
          else
          
                     p =
          null
          ;
             }
         }

         
          public
          
          static
          
          void
           main(String[] args) {
             BinTree tree =
          new
           BinTree(init());
             System.out.print(
          " Pre-Order:"
          );
             preorder(tree.getRoot());
             System.out.println();
             System.out.print(
          "  In-Order:"
          );
             inorder(tree.getRoot());
             System.out.println();
             System.out.print(
          "Post-Order:"
          );
             postorder(tree.getRoot());
             System.out.println();
             System.out.print(
          " Pre-Order:"
          );
             iterativePreorder(tree.getRoot());
             System.out.println();
             System.out.print(
          "  In-Order:"
          );
             iterativeInorder(tree.getRoot());
             System.out.println();
             System.out.print(
          "Post-Order:"
          );
             iterativePostorder(tree.getRoot());
             System.out.println();
         }
    }
          
         
       
    输出结果
      Pre-Order:H D B A C G F E
       In-Order:B A D C H G E F
    Post-Order:A B C D E F G H
      Pre-Order:H D B A C G F E
       In-Order:B A D C H G E F
    Post-Order:A B C D E F G H  
        本文出自 “子 孑” 博客,请务必保留此出处http://zhangjunhd.blog.51cto.com/113473/82616
       
       

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/14/000831578.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 07:27 , Processed in 0.339876 second(s), 35 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表