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

原创 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();
    }
}

输出结果:

控制台输出

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

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

二叉树的遍历详解(前序中序后序层次-递归和非递归)

二叉树二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不...
  • gatieme
  • gatieme
  • 2016-04-15 17:04:33
  • 8546

二叉树的前序,中序,后续,递归及非递归遍历的python实现

在计算机科学里,树的遍历(也称为树的搜索)是图的遍历的一种,指的是按照某种规则,不重复地访问某种树的所有节点的过程。具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是...
  • John_xyz
  • John_xyz
  • 2018-02-21 14:35:48
  • 132

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

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

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

import java.util.*; public class BinaryTree {  private BinaryTree lchild;  private BinaryTree rch...
  • chj97
  • chj97
  • 2011-10-05 21:25:14
  • 15133

非递归实现二叉树的前序,中序,后序遍历打印

前言:前面这篇文章主要是用递归的思想写了一颗二叉树,其中包括前序建树;前序,中序,后序遍历打印,层序遍历(非递归);求高度;求节点数;求叶子节点数;求第k层结点树等;详情请看: 递归实现二叉树的前,...
  • gogogo_sky
  • gogogo_sky
  • 2017-04-12 17:40:08
  • 654

二叉树的先序、中序、后序遍历的递归和非递归实现

#include "stdafx.h" #include using namespace std; const int MAXSIZE = 20; //定义栈空间大小为20 stru...
  • htyurencaotang
  • htyurencaotang
  • 2013-10-07 13:17:22
  • 4277

通过二叉树的中序和后序遍历序列构造二叉树(非递归)

通过二叉树的中序和后序遍历序列构造二叉树的非递归实现方法
  • zaizai09
  • zaizai09
  • 2014-05-10 19:55:38
  • 1915

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

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

c语言实现二叉树的前中后序遍历 递归和非递归 数据结构

  • 2014年03月23日 20:51
  • 7KB
  • 下载
收藏助手
不良信息举报
您举报文章:二叉树前序、中序、后序遍历(递归版、非递归版)
举报原因:
原因补充:

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