`

java遍历二叉树<先、中、后序遍历>(转)

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

 

分享到:
评论

相关推荐

    递归方式遍历二叉树

    java实现创建二叉树,并且遍历二叉树(此处使用递归方式遍历); 创建二叉树的方式有很多,此处使用线性的链表转化成二叉树,链表节点的顺序就是前序遍历的顺序,链表中的null值,代表二叉树左节点或者右节点为null...

    java二叉树的前序+中序+后序遍历(修改后)

    二叉树的遍历,全部用递归实现,很有规律! 二叉树的遍历,全部用递归实现,很有规律

    Java输出后序遍历二叉树的代码

    附件是Java输出后序遍历二叉树的代码,后序遍历的顺序是:首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。 TreeNode 类定义了二叉树的节点,BinaryTree 类包含一个 root 属性和 ...

    java 二叉树遍历

    Java 二叉树遍历 二叉树是一种重要的数据结构,在计算机科学中有广泛的应用。在 Java 语言中,二叉树的遍历是指从根... Java 中有多种遍历方式,包括先序遍历、中序遍历和后序遍历,每种方式都有其特点和应用场景。

    java二叉树的前序+中序+后序遍历

    java实现 二叉树的遍历 前序遍历用到递归, 中序和后序遍历用到栈, 其实还是有一定难度的

    Java实现二叉树的遍历

    java实现二叉树非递归前序中序后序遍历

    后序遍历二叉树-Java 版本

    在Java中,实现二叉树的后序遍历可以通过递归来完成。后序遍历的顺序是:首先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。 在这段代码中,Node类定义了二叉树的节点,BinaryTree类包含一个指向根节点...

    遍历二叉树(java实现)

    在提供的压缩包文件中,可能包含了这三个遍历方法的Java源代码,如`我的后序遍历java.txt`、`先序遍历java.txt`和`中序遍历java.txt`。这些文件应该分别实现了上述的后序、先序和中序遍历算法。通过阅读和理解这些...

    根据二叉树前序遍历和中序遍历的结果输出后序遍历(java)

    在递归构建子树的过程中,我们可以记录每个节点的后序遍历顺序,从而得到整个二叉树的后序遍历序列。 在Java中,我们可以定义一个`BinaryTreeBuilder`类来实现这个过程。该类可能包含以下方法: - `buildTree(int...

    二叉树遍历问题先序遍历、中序遍历和后序遍历等等最新详情介绍.docx

    以下提供了一段Java代码示例,展示了二叉树的前序、中序和后序遍历的递归和迭代版本的实现: ```java class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } ...

    【课件】5.3.1_1二叉树的先中后序遍历.pdf

    根据给定文件的信息,我们可以明确地了解到文档的主题是关于二叉树的三种遍历方法:先序遍历、中序遍历以及后序遍历。接下来,我们将详细地阐述这三种遍历方式的概念、实现原理及其应用场景。 ### 一、先序遍历 ##...

    java 实现的二叉树前序建树,中序建树,后序建树以及前序遍历,中序遍历和后序遍历的代码

    **后序建树**:后序遍历的顺序是左-右-根,构建后序二叉树的过程较为复杂,需要用到两个栈: ```java public TreeNode buildTreePostOrder(String[] postorder, String[] inorder) { Map&lt;String, Integer&gt; map = ...

    已知二叉树的前序和中序遍历,打印后序遍历

    前序、中序和后序遍历是二叉树三种基本的遍历方式,每种方式都有其特定的访问顺序。这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -&gt; 左子树 -...

    遍历二叉树java代码

    在Java编程语言中,遍历二叉树是一种常见的操作,用于访问树结构中的所有节点。二叉树有三种主要的遍历方式:前序遍历、中序遍历和后序遍历。以下是对这些遍历方法的详细解释,以及可能在`Tree.java`、`TestTree....

    JAVA/Python实现二叉树遍历

    二叉树的遍历方式主要有四种:前序遍历、中序遍历、后序遍历和层次遍历。 前序遍历的顺序是:先访问根节点,然后访问左子树,最后访问右子树。前序遍历、中序遍历和后序遍历主要描述的是父节点被访问的次序。如果父...

    二叉树的遍历 java语言实现

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

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

    3. **后序遍历**:先递归地访问左子树,再递归地访问右子树,最后访问根节点。 这些递归方法已经在提供的代码片段中实现。 ##### 3.4 非递归遍历 非递归遍历通常使用栈来辅助实现,具体分为以下几种方式: 1. **...

    建二叉树并分别用先先序、中序和后序遍历,然后输出各遍历序列

    在这个任务中,我们将关注如何使用二叉链表来构建二叉树,并对其进行先序、中序和后序遍历。此外,我们还将探讨如何交换二叉树中所有节点的左右孩子。 首先,二叉链表是二叉树的一种常见存储方式,每个节点包含两个...

Global site tag (gtag.js) - Google Analytics