`

(转)java语言实现二叉树的前序、中序与后序遍历(递归与非递归)

 
阅读更多

http://blog.csdn.net/chj97/article/details/6845824

 

import java.util.*;
public class BinaryTree {
 private BinaryTree lchild;
 private BinaryTree rchild;
 private Object data;
 /**
  * @param args
  */
 public BinaryTree(BinaryTree l, BinaryTree r, Object data) {
  lchild = l;
  rchild = r;
  this.data = data;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  BinaryTree  G= new BinaryTree(null, null, 'G');
  BinaryTree  H= new BinaryTree(null, null, 'H');
  BinaryTree  F= new BinaryTree(G, H, 'F');
  BinaryTree  D= new BinaryTree(null, F, 'D');
  BinaryTree  E= new BinaryTree(null, null, 'E');
  BinaryTree  B= new BinaryTree(D, E,  'B');
  BinaryTree  C= new BinaryTree(null, null, 'C');
  BinaryTree A = new BinaryTree(B, C, 'A');
  
  System.out.println("先序遍历。。。。。。。"); 
  pre(A);
        System.out.println(); 
       
        System.out.println("中序遍历。。。。。。。"); 
  in(A);
       System.out.println(); 
        
        System.out.println("后序遍历。。。。。。。"); 
  post(A);
       System.out.println(); 
        
        System.out.println("非递归先序遍历。。。。。。。"); 
  preTraverse(A);
        System.out.println(); 
        
        System.out.println("非递归中序遍历。。。。。。。"); 
  inTraverse(A);
        System.out.println(); 
        
        System.out.println("非递归后序遍历。。。。。。。"); 
  postTraverse(A);
        System.out.println(); 
        
        System.out.println("非递归后序遍历2。。。。。。。"); 
        postTraverse2(A);
        System.out.println(); 
 }
 
 public static void visit(BinaryTree bt) {
  System.out.print(bt.data + " ");
 }
 
 //递归先序遍历
 public static void pre(BinaryTree root) {
  if(root == null)return;
  visit(root);
  if(root.lchild != null)pre(root.lchild);
  if(root.rchild != null)pre(root.rchild);
 }
 
 //递归中序遍历
 public static void in(BinaryTree root) {
  if(root == null)return;
  if(root.lchild != null)in(root.lchild);
  visit(root);
  if(root.rchild != null)in(root.rchild);
 }
 
 //递归后序遍历
 public static void post(BinaryTree root) {
  if(root == null)return;
  if(root.lchild != null)post(root.lchild);
  if(root.rchild != null)post(root.rchild);
  visit(root);
 }
 
 //非递归先序遍历
 public static void preTraverse(BinaryTree root) {
  Stack s = new Stack();
  s.push(root);
  while(!s.isEmpty()) {
   BinaryTree bt = (BinaryTree)s.pop();
   visit(bt);
   if(bt.rchild != null) s.push(bt.rchild);
   if(bt.lchild != null) s.push(bt.lchild);
  }
 }
 
 //非递归中序遍历
 public static void inTraverse(BinaryTree root) {
  Stack s = new Stack();
  BinaryTree p = root;
  while(p!=null || !s.isEmpty()) {
   if(p!=null) {
    s.push(p);
    p = p.lchild;
   }
   else {
    p = (BinaryTree)s.pop();
    visit(p);
    p = p.rchild;
   }
  }
 }
 
 //非递归后序遍历
 public static void postTraverse(BinaryTree root) {
  Stack s = new Stack();
  BinaryTree p = root;
  //pre标记最近出栈的节点,用于判断是否是p节点的右孩子,如果是的话,就可以访问p节点
  BinaryTree pre = p;
  //flag标记是出栈还是继续将左孩子进栈
  boolean flag = true;
  while(p!=null || !s.isEmpty()) {
   if(p!=null && flag) {
    s.push(p);
    p = p.lchild;
   }
   else {
    if(s.isEmpty()) return;
    p = (BinaryTree)s.peek();
    if(p.rchild != null && p.rchild!=pre) {
     p = p.rchild;
     flag = true;
    }
    else {
     p = (BinaryTree)s.pop();
     visit(p);
     flag = false;
     pre = p;
    }
   }
  }
 }
 
 //非递归后序遍历2
 public static void postTraverse2(BinaryTree root) {
  Stack s = new Stack();
  BinaryTree p = root;
  //pre标记最近出栈的节点,用于判断是否是p节点的右孩子,如果是的话,就可以访问p节点
  BinaryTree pre = p;
  while(p!=null || !s.isEmpty()) {
   if(p!=null) {
    s.push(p);
    p = p.lchild;
   }
   else {
    if(s.isEmpty()) return;
    p = (BinaryTree)s.peek();
    if(p.rchild != null && p.rchild!=pre) {
     p = p.rchild;
    }
    else {
     p = (BinaryTree)s.pop();
     visit(p);
     pre = p;
     p = null;
    }
   }
  }
 }
}

分享到:
评论

相关推荐

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

    这里我们将重点讨论如何在已知二叉树的前序和中序遍历的情况下,通过非递归算法实现后序遍历。 **前序遍历**:根节点 -> 左子树 -> 右子树 **中序遍历**:左子树 -> 根节点 -> 右子树 **后序遍历**:左子树 -> 右子...

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

    建立二叉树的过程通常是从给定的输入序列(如前序、中序或后序遍历序列)开始的。例如,如果给定的是前序遍历序列,我们可以首先找到根节点,然后递归地构建左右子树。在中序遍历序列中,根节点位于序列的中间,而在...

    建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数

    [问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。

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

    本文将深入探讨如何使用Java实现二叉树的前序、中序和后序建树,以及对应的遍历方法。 首先,我们需要定义一个二叉树节点类`TreeNode`,它包含两个属性:一个整型值`val`表示节点的值,以及两个指向子节点的引用`...

    用Python实现二叉树、二叉树非递归遍历及绘制的例子

    本文主要通过python以非递归形式实现二叉树构造、前序遍历,中序遍历,后序遍历,层次遍历以及求二叉树的深度及叶子结点数。其他非递归形式的遍历,想必大多人应该都很清楚,就不再声明。如果你用C或者C++或者其他...

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

    后序遍历的非递归实现较为复杂,一种常用的方法是两次遍历: ```java public void iterativePostOrderTraverse(Node root) { Stack<Node> stack1 = new Stack(); Stack<Node> stack2 = new Stack(); stack1.push...

    Java实现二叉树的遍历

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

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

    二叉树的遍历是访问每个节点的过程,通常分为三种主要方式:前序遍历、中序遍历和后序遍历。在实际应用中,我们可以通过递归和非递归两种方法来实现这些遍历。 一、递归遍历 递归是一种函数调用自身的技术,对于...

    树的前序遍历

    除了递归,还可以使用栈来非递归地实现前序遍历,这种方式对于深度较大的树更有效,因为递归可能导致栈溢出。非递归方法的基本思想是:先将根节点压入栈,然后不断弹出栈顶元素并访问,同时将其左右子节点(如果存在...

    组合模式二叉树,前序、中序、后续,迭代器模式访问遍历

    在这个主题中,我们主要探讨了如何利用组合模式(Composite Pattern)构建二叉树,并通过迭代器模式(Iterator Pattern)来实现对树的遍历,包括前序、中序和后序遍历。这些是设计模式中的经典应用,对于理解和掌握...

    四种根据给定遍历序列构造二叉树总结(JAVA递归和非递归版)

    构造二叉树根据前序与中序遍历序列构造二叉树根据先序遍历构造二叉搜索树根据中序与后序遍历序列构造二叉树根据前序与后序遍历序列构造二叉树 二叉树的遍历顺序及方法可参考之前写过的二叉树的遍历(JAVA递归和非...

    二叉树的遍历(递归+非递归 Java语言版)

    在Java编程中,二叉树的遍历主要有三种方式:前序遍历、中序遍历和后序遍历。接下来,我们将详细讨论这些遍历方法以及递归和非递归实现。 1. **前序遍历**:前序遍历的顺序是“根-左-右”。首先访问根节点,然后...

    二叉树的遍历 java语言实现

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

    二叉树的后序遍历(java代码).docx

    后序遍历是三种基本的二叉树遍历方法之一,另外两种为前序遍历和中序遍历。后序遍历的基本思想是从根节点出发,首先遍历左子树,然后遍历右子树,最后访问根节点。 #### 二、后序遍历算法原理 **1. 递归实现** ...

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

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

    满二叉树的前序遍历C++实现

    因此,满二叉树的前序遍历、中序遍历和后序遍历均可以通过递归方式实现。 以前序遍历为例,满二叉树的前序遍历顺序为:根、左、右。 在具体实现过程中,我们可以通过构造一个满二叉树,然后进行前序遍历来获取遍历...

    java实现二叉树的Node节点定义手撕8种遍历(一遍过).doc

    资源概要:本文档主要讲述了在 Java 中如何实现二叉树的 Node 节点定义,并且提供了八种遍历算法的实现,包括递归前序遍历、递归中序遍历、递归后序遍历、非递归前序遍历、非递归中序遍历、非递归后序遍历、广度优先...

    二叉树相关操作java实现

    1:构造一个二叉树 2:二叉树前序遍历(递归) 3:二叉树中序遍历(递归) 4:二叉树后续遍历(递归) 5:二叉树前序遍历(非递归) 6:二叉树中序遍历(非递归) 7:二叉树后序遍历(非递归)

    java二叉树的遍历

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

    二叉树的遍历(递归+非递归 Java版)

    在Java编程中,二叉树的遍历主要有三种方法:前序遍历、中序遍历和后序遍历。下面将详细介绍这些遍历方法及其递归和非递归实现。 1. **前序遍历**: - **描述**:前序遍历的顺序是“根-左-右”。首先访问根节点,...

Global site tag (gtag.js) - Google Analytics