`
gaochangquan
  • 浏览: 18878 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

Java实现二叉树的遍历算法

阅读更多
Java实现二叉树的遍历算法(递归与非递归)
package com.test;
import java.util.Stack;

/** 二叉树节点 */
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();
     }
}


分享到:
评论

相关推荐

    java实现二叉树遍历算法(源代码)

    ### Java实现二叉树遍历算法详解 #### 一、引言 在计算机科学中,二叉树是一种常用的数据结构,广泛应用于各种算法和数据处理场景。为了更好地理解和操作二叉树,掌握其遍历算法至关重要。本文将详细介绍如何使用...

    java实现二叉树遍历demo

    本示例"java实现二叉树遍历demo"将通过一个简单的实例来演示这三种遍历方式。 1. **前序遍历**: 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。在代码实现中,通常采用递归的方法。首先访问根节点,然后递归地...

    数据结构-二叉树Java实现及其遍历算法

    数据结构-二叉树Java实现及其遍历算法,代码示例中实现了中序遍历,简单易学。

    二叉树遍历算法解析与实现(递归、迭代、Morris遍历)

    适合人群:对数据结构有一定基础的开发者,特别是希望深入理解二叉树遍历算法的人群。 使用场景及目标:① 掌握递归和迭代的不同遍历方法;② 学习如何使用Morris遍历减少空间复杂度;③ 准备编程面试中的算法题。 ...

    Java版二叉树遍历非递归程序

    ### Java版二叉树遍历非递归程序详解 #### 一、引言 在计算机科学领域中,二叉树是一种常见的数据结构,其在算法设计、数据存储以及搜索等方面有着广泛的应用。对于二叉树的操作,遍历是其中非常重要的一项技术。...

    Java二叉树中序遍历

    中序遍历是二叉树遍历的一种方法,它按照“左-根-右”的顺序访问树中的所有节点,对于理解树的性质和执行某些操作非常有用。本课程设计将详细介绍如何使用Java编程语言实现二叉树的中序遍历。 首先,我们先构建...

    队列实现二叉树遍历.rar

    在计算机科学中,二叉树是一种非常基础且重要的数据结构,它由节点构成,每个节点最多有两个子节点,通常称为左子节点和右子节点。...理解并掌握二叉树遍历及其队列实现,对于提升算法能力和解决实际问题具有重要意义。

    java算法二叉树遍历源码文档.doc

    二叉树遍历在实际应用中有着广泛的应用,例如在文件系统中组织目录结构,搜索引擎的倒排索引,以及计算机科学中的许多算法实现,如二分查找、AVL树、红黑树等。理解并能够灵活运用这些遍历方法对于掌握数据结构和...

    二叉树各种遍历算法

    对于给定的压缩包文件"二叉树各种遍历算法",其中应该包含了上述各种遍历方法的代码示例,可能包括C++、Java、Python或其他编程语言。通过学习这些代码,你可以深入理解每种遍历方法的实现细节,并且可以运用到实际...

    二叉树的遍历 java语言实现

    二叉树遍历是访问二叉树中所有节点的过程,通常有三种主要方法:前序遍历、中序遍历和后序遍历。这些遍历方式对于理解和操作二叉树数据结构至关重要。 1. **前序遍历**(Preorder Traversal): - 访问根节点。 -...

    二叉树遍历 单步演示

    在计算机科学中,二叉树是...总结来说,"二叉树遍历 单步演示"项目提供了一个学习和实践二叉树遍历的平台,借助Eclipse J2SE的调试功能,用户可以直观地了解遍历过程,有助于深化对二叉树数据结构及其遍历算法的理解。

    java实现的二叉树的递归和非递归遍历

    在Java编程语言中,二叉树是一种非常...通过阅读和理解这些代码,你可以更好地掌握二叉树遍历的原理和实践,这对于理解和解决涉及二叉树的算法问题至关重要。在实际编程中,选择哪种遍历方法取决于具体需求和性能考虑。

    二叉树 层序遍历 java实现 课程设计

    总的来说,这个课程设计旨在让学生深入理解二叉树的层序遍历算法,掌握其Java实现,并通过实践提高编程能力。这是一项基础但关键的任务,对后续学习更复杂的算法和数据结构有着重要的铺垫作用。

    二叉树遍历(C)- 非递归版.pdf

    二叉树遍历(C)- 非递归版 本文档主要讲述了二叉树的非递归遍历算法,包括...本文档提供了二叉树非递归遍历算法的详细讲解,包括先序遍历和中序遍历两种遍历方式,旨在帮助读者深入理解二叉树遍历算法的实现细节。

    二叉树遍历算法 (递归的、非递归的中序、前序、后序遍历 和 层次遍历 以及 求二叉树的宽度和深度)

    ### 二叉树遍历算法详解 #### 一、引言 二叉树是一种非常重要的数据结构,在计算机科学中有着广泛的应用。对于二叉树的操作,遍历是最基础且核心的功能之一。通过不同的遍历方式,我们可以从多个角度理解二叉树的...

    二叉树遍历.rar

    在你解压的文件中,"二叉树的遍历.cpp"可能是实现了以上遍历算法的C++代码,而"二叉树的遍历.doc"可能包含了对这些概念的详细解释,以及可能的作业要求和解题思路。通过阅读和理解这些文件,你可以深入学习和掌握...

    二叉树的遍历-java

    在计算机科学中,二叉树遍历是访问树中所有节点的一种基本操作,通常有三种主要的遍历方式:前序遍历、中序遍历和后序遍历。这些遍历方法在数据结构和算法领域中有着广泛的应用,特别是在编译器设计、搜索算法和数据...

    Java实现二叉树的层次遍历

    本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的层次顺序访问所有节点。 首先,我们需要定义二叉树节点的数据结构。在`BinaryTree.java`文件中,我们可以创建一个名为`Node`的类来表示树...

    Java实现二叉树的深度优先遍历和广度优先遍历算法示例

    Java实现二叉树的深度优先遍历和广度优先遍历算法示例 本文主要介绍了Java实现二叉树的深度优先遍历和广度优先遍历算法,结合实例形式详细分析了二叉树的定义、深度优先遍历与广度优先遍历算法原理与相关操作实现...

    java二叉树的遍历

    在给定的代码中,作者提供了一个完整的Java实现,包括递归和非递归的前序、中序和后序遍历算法。下面将对这些算法进行详细的解释和分析。 递归前序遍历 递归前序遍历的算法可以描述为:访问当前节点,然后递归地...

Global site tag (gtag.js) - Google Analytics