【Java语言学习】之递归、非递归前序、中序、后续遍历二叉树

转载 2016年08月31日 14:52:33

转载:http://blog.csdn.net/haijiaoxiaowu/article/details/4851059

文章非常不错,帮了大忙,讲解很详细

package com.nowcoder.校招真题2016;

import java.util.Stack;  
import java.util.HashMap;  
  
public class BinTree {  
    private char date;  
    private BinTree lchild;  
    private BinTree rchild;  
  
    public BinTree(char c) {  
        date = c;  
    }  
  
    // 先序遍历递归   
    public static void preOrder(BinTree t) {  
        if (t == null) {  
            return;  
        }  
        System.out.print(t.date);  
        preOrder(t.lchild);  
        preOrder(t.rchild);  
    }  
  
    // 中序遍历递归   
    public static void InOrder(BinTree t) {  
        if (t == null) {  
            return;  
        }  
        InOrder(t.lchild);  
        System.out.print(t.date);  
        InOrder(t.rchild);  
    }  
  
    // 后序遍历递归   
    public static void PostOrder(BinTree t) {  
        if (t == null) {  
            return;  
        }  
        PostOrder(t.lchild);  
        PostOrder(t.rchild);  
        System.out.print(t.date);  
    }  
  
    // 先序遍历非递归   
    public static void preOrder2(BinTree t) {  
    	Stack<BinTree> s = new Stack<BinTree>();  
        while (t != null || !s.empty()) {  
            while (t != null) {  
                System.out.print(t.date);  
                s.push(t);  
                t = t.lchild;  
            }  
            if (!s.empty()) {  
                t = s.pop();  
                t = t.rchild;  
            }  
        }  
    }  
  
    // 中序遍历非递归   
    public static void InOrder2(BinTree t) {  
    	 Stack<BinTree> s = new Stack<BinTree>(); 
        while (t != null || !s.empty()) {  
            while (t != null) {  
                s.push(t);  
                t = t.lchild;  
            }  
            if (!s.empty()) {  
                t = s.pop();  
                System.out.print(t.date);  
                t = t.rchild;  
            }  
        }  
    }  
  
    // 后序遍历非递归   
    public static void PostOrder2(BinTree t) {  
    	Stack<BinTree> s = new Stack<BinTree>(); 
    	Stack<Integer> s2 = new Stack<Integer>();  
        Integer i = new Integer(1);  
        while (t != null || !s.empty()) {  
            while (t != null) {  
                s.push(t);  
                s2.push(new Integer(0));  
                t = t.lchild;  
            }  
            while (!s.empty() && s2.peek().equals(i)) {  
                s2.pop();  
                System.out.print(s.pop().date);  
            }  
  
            if (!s.empty()) {  
                s2.pop();  
                s2.push(new Integer(1));  
                t = s.peek();  
                t = t.rchild;  
            }  
        }  
    }  
  
    public static void main(String[] args) {  
        BinTree b1 = new BinTree('a');  
        BinTree b2 = new BinTree('b');  
        BinTree b3 = new BinTree('c');  
        BinTree b4 = new BinTree('d');  
        BinTree b5 = new BinTree('e');  
  
        /** 
         *      a  
         *     / / 
         *    b   c 
         *   / / 
         *  d   e 
         */  
        b1.lchild = b2;  
        b1.rchild = b3;  
        b2.lchild = b4;  
        b2.rchild = b5;  
  
        BinTree.preOrder(b1);  
        System.out.println();  
        BinTree.preOrder2(b1);  
        System.out.println();  
        BinTree.InOrder(b1);  
        System.out.println();  
        BinTree.InOrder2(b1);  
        System.out.println();  
        BinTree.PostOrder(b1);  
        System.out.println();  
        BinTree.PostOrder2(b1);  
    }  
}  



C++实现二叉树前序中序后续遍历的非递归方法总结

前序中序相对简单,不废话,直接代码:
  • njustzj001
  • njustzj001
  • 2014年10月13日 15:16
  • 2491

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

非递归实现二叉树的后续遍历,思想是先定义一个带有标记和二叉树节点的类,把类压栈,并且要设置标记,赋值为true,然后出栈,并且改变标记true为false,最后遍历右子树,直到第二次开始出栈,标记是f...
  • jcm666666
  • jcm666666
  • 2016年09月03日 21:24
  • 494

树的学习——(递归构建二叉树、递归非递归前序中序后序遍历二叉树、根据前序序列、中序序列构建二叉树)

前言 最近两个星期一直都在断断续续的学习二叉树的数据结构,昨晚突然有点融汇贯通的感觉,这里记录一下吧 题目要求 给定前序序列,abc##de#g##f###,构建二叉树,并且用递归和非递归两种方法...
  • zinss26914
  • zinss26914
  • 2012年12月29日 10:46
  • 7669

二叉树的前序、中序、后序的递归与非递归遍历算法实现

看代码一目了然。 C++代码:#include #include #include using namespace std;//二叉树节点 typedef struct BitNode{ ...
  • u011954296
  • u011954296
  • 2016年07月12日 12:31
  • 2816

二叉树的创建 先序 中序 后续 递归和非递归遍历

二叉树 递归非递归遍历 总结
  • u011561690
  • u011561690
  • 2015年04月15日 19:00
  • 879

二叉树先序、中序、后续遍历递归以及非递归java实现

闲来无事,对二叉树的遍历做个总结,下面是使用java对二叉树遍历的各种实现,与大家分享 public class Main { /** * 递归先序遍历二叉树 * @author zhan...
  • u011824857
  • u011824857
  • 2016年09月21日 22:15
  • 1313

二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现

什么是树?什么是二叉树? 树:除了根节点之外的所有节点都有且只有一个父节点,根节点没有父节点;除了叶结点以外的所有节点,都有一个或多个子节点,叶结点没有子节点。 二...
  • u014039577
  • u014039577
  • 2015年12月24日 17:55
  • 1960

二叉树(1)----先序遍历(前序遍历),递归和非递归方式实现

1、二叉树节点定义 typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef stru...
  • beitiandijun
  • beitiandijun
  • 2014年12月14日 19:00
  • 3779

二叉树的非递归遍历以及层次遍历(前序、中序、后序)

先使用先序的方法建立一棵二叉树,然后分别使用递归与非递归的方法实现前序、中序、后序遍历二叉树,并使用了两种方法来进行层次遍历二叉树,一种方法就是使用STL中的queue,另外一种方法就是定义了一个数组...
  • yusiguyuan
  • yusiguyuan
  • 2014年11月07日 21:11
  • 1671

根据前序和中序序列,建立二叉树(java实现)

根据前序序列:int[] preSort={1,2,4,7,3,5,6,8}; 中序序列:int[] inSort=new int[]{4,7,2,1,5,3,8,6}; 建立二叉树,求后序遍历等问题...
  • A784586
  • A784586
  • 2017年01月09日 18:13
  • 658
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【Java语言学习】之递归、非递归前序、中序、后续遍历二叉树
举报原因:
原因补充:

(最多只允许输入30个字)