二叉树前序、中序、后序遍历(递归版、非递归版)

原创 2016年07月22日 08:47:16

复习二叉树的遍历,自己实现了一遍代码,在这里进行下记录,递归和非递归都写出来了,感谢各位的批评指正。

节点定义:

package com.al;

public class Node {

    public String value;
    public Node leftNode;
    public Node rightNode;

    public Node(String value) {
        this.value = value;
    }
}

递归版:

package com.al;
/**
 * 递归版
 * @author MSI
 *
 */
public class recursionTraversal {
    //前序
    public static void DLR(Node root) {
        if (root == null) {
            return;
        } else {
            System.out.print(root.value + " ");
            DLR(root.leftNode);
            DLR(root.rightNode);
        }
    }
    //中序
    public static void LDR(Node root) {
        if (root == null) {
            return;
        } else {
            LDR(root.leftNode);
            System.out.print(root.value + " ");
            LDR(root.rightNode);
        }
    }
    //后序
    public static void LRD(Node root) {
        if (root == null) {
            return;
        } else {
            LRD(root.leftNode);
            LRD(root.rightNode);
            System.out.print(root.value + " ");
        }
    }

}

非递归版:(因为递归都可以用栈进行实现)
package com.al;

import java.util.Stack;

/**
* 非递归遍历
*
* @author MSI
*
*/
public class nonRecursionTraversal {

// 前序遍历
/**
 * 1. 申请一个新的栈,记为 stack。然后将头节点 root 压入 stack 中。
 * 2. 从 stack中弹出栈顶节点,记为root,然后打印root 节点的值,
 *     再将节点 root 的右孩 子(不为空的话)先压入 stack 中, 最后将 root 的左孩子(不为空的话继续进行压栈)。 
 * 3. 不断重复步骤 2,直到 stack 为空,全部过程结束。
 * 
 * @param root
 */
public static void DLR(Node root) {
    if (root != null) {
        Stack<Node> stack = new Stack<Node>();
        stack.add(root);
        while (!stack.isEmpty()) {
            root = stack.pop();
            System.out.print(root.value + " ");
            if (root.rightNode != null) {
                stack.add(root.rightNode);
            }
            if (root.leftNode != null) {
                stack.add(root.leftNode);
            }
        }
    }
}

// 中序遍历
/**
 * 1.申请一个新的栈,记为 stack。初始时,令变量 cur=root。 
 * 2.先把 cur 节点压入栈中,对以 cur 节点为头的整棵子树来说,依次把左边界压入栈 中,即不停地令 cur=cur.leftNode,
 *    然后重复步骤 2。 
 * 3.不断重复步骤 2,直到发现 cur为空,此时从 stack 中弹出一个节点,记为 node。
 *    打印 cur 的值,并且让 cur=cur.rightNode,然后继续重复步骤 2。
 * 4.当 stack 为空且 cur 为空时,整个过程停止。
 * 
 * @param root
 */
public static void LDR(Node root) {
    if (root != null) {
        Stack<Node> stack = new Stack<Node>();
        // 若栈不为空,且节点不为空,一直循环执行
        while (!stack.isEmpty() || root != null) {
            // 若当前节点不空。则继续往左子树下探;
            if (root != null) {
                stack.push(root);
                root = root.leftNode;
            } else {// 否则将当前栈顶元素弹出,并将往右子树下探;
                root = stack.pop();
                System.out.print(root.value + " ");
                root = root.rightNode;
            }
        }
    }
}

// 后序遍历
/**
 * 1.申请一个栈,记为 s1,然后将头节点 root 压入 s1 中。 
 * 2.从 s1 中弹出的节点记为 cur,然后依次将 cur的左孩子和右孩子压入 s1 中。 
 * 3.在整个过程中,每一个从 s1 中弹出的节点都放进 s2 中。 
 * 4.不断重复步骤 2 和步骤 3,直到 s1为空,过程停止。
 * 5.从 s2 中依次弹出节点并打印,打印的顺序就是后序遍历的顺序。
 * 
 * @param root
 */
public static void LRD(Node root) {
    if (root != null) {
        Stack<Node> s1 = new Stack<Node>();
        Stack<Node> s2 = new Stack<Node>();
        s1.push(root);
        while (!s1.isEmpty()) {
            root = s1.pop();
            s2.push(root);
            if (root.leftNode != null) {
                s1.push(root.leftNode);
            }
            if (root.rightNode != null) {
                s1.push(root.rightNode);
            }
        }
        while (!s2.isEmpty()) {
            System.out.print(s2.pop().value + " ");
        }
    }
}

}

最后一起进行测试:

package com.al;

public class Test {

    public static void main(String[] args) {
        //定义二叉树结构
        Node root = new Node("A");
        root.leftNode = new Node("B");
        root.rightNode = new Node("C");
        root.leftNode.leftNode = new Node("D");
        root.leftNode.rightNode = new Node("E");
        root.rightNode.leftNode = new Node("F");
        root.rightNode.rightNode = new Node("G");

        /**
         * 递归版
         */
        System.out.println("递归版:");
        System.out.print("前序遍历:");
        recursionTraversal.DLR(root);
        System.out.println();
        System.out.print("中序遍历:");
        recursionTraversal.LDR(root);
        System.out.println();
        System.out.print("后序遍历:");
        recursionTraversal.LRD(root);
        System.out.println("\n"+"------------------------");
        /**
         * 非递归版
         */
        System.out.println("非递归版:");
        System.out.print("前序遍历:");
        nonRecursionTraversal.DLR(root);
        System.out.println();
        System.out.print("中序遍历:");
        nonRecursionTraversal.LDR(root);
        System.out.println();
        System.out.print("后序遍历:");
        nonRecursionTraversal.LRD(root);
        System.out.println();
    }
}

输出结果:

控制台输出

二叉树前序、中序、后序遍历非递归写法的透彻解析

二叉树前序、中序、后序遍历非递归写法的透彻解析 前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里...
  • a925907195
  • a925907195
  • 2015年06月13日 00:11
  • 1198

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

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

算法:二叉树的先序遍历、中序遍历、后序遍历(递归及非递归方式)的java代码实现

首先来看一棵二叉树: 1、前序遍历: 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树...
  • jssongwei
  • jssongwei
  • 2016年03月03日 17:33
  • 6637

二叉树前序、中序、后序遍历非递归写法的透彻解析

前言 在前两篇文章二叉树和二叉搜索树中已经涉及到了二叉树的三种遍历。递归写法,只要理解思想,几行代码。可是非递归写法却很不容易。这里特地总结下,透彻解析它们的非递归写法。其中,中序遍历的非递归写法最...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年07月06日 22:14
  • 64211

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

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

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

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

二叉树 前序 中序 后序 递归 和非递归

#include "stdafx.h" #include "iostream" #include #include #include using namespace std; //B...
  • u010343650
  • u010343650
  • 2016年02月01日 13:07
  • 272

数据结构:二叉树的前序,中序,后序遍历(递归和非递归)

二叉树的使用,在数据结构中是比较常见的。这里列举了二叉树的四种遍历方式:前序,中序,后序遍历(递归和非递归的方式)以及层次遍历的方法,供大家参考。...
  • qq_27704269
  • qq_27704269
  • 2016年09月17日 23:40
  • 675

二叉树的创建与前序、中序和后序的递归与非递归调用

#include #include #include #include using namespace std; typedef char ElemType; class BiTNode { fr...
  • u014033518
  • u014033518
  • 2014年08月26日 10:51
  • 571

前中后序非递归遍历算法

//以下均是模拟系统调用机制 //非递归前序遍历: // 进栈的同时输出 // 有左儿子进,无左二子出栈 // 出栈时调用右儿子,进栈调左儿子 // //非递归中序遍历: // 有左儿子...
  • h1023417614
  • h1023417614
  • 2014年01月27日 20:43
  • 9987
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二叉树前序、中序、后序遍历(递归版、非递归版)
举报原因:
原因补充:

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