`

JAVA语言实现二叉树的层次遍历的非递归算法及递归算法

阅读更多
总则:
1.二叉树遍历:逻辑、具体算法理解即可,不必自己写出来. //太复杂了.
2.整理理解:

原文参考:http://blog.csdn.net/oney139/article/details/8063953
二叉树遍历 BinTree
package edu.yhf.demo.binaryTree;

import java.util.Stack;

/**
 *  二叉树遍历
 * @author lengzl
 * @email 819681951@qq.com
 * @create 2017年2月9日 下午3:20:02
 * 原文参考:http://blog.csdn.net/oney139/article/details/8063953
 */
public class BinTree {
    protected BTNode root;
    public BinTree(BTNode root) {
        this.root = root;
    }
    public BTNode getRoot() {
        return root;
    }
    /** 构造树I
      	H
      / \
      D  G
     / \  \
    B  C   F
     \	  /
     A	 E
     * @author lengzl
     * @email 819681951@qq.com
     * @create 2017年2月9日 上午9:39:00
     * @return
     */
     
    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); //根节点
        BTNode
        */
     /** 构造树II
       A
      / \
      B  C
     / \  \
    D  E   F
      /   / \
     G   N  I
    /	 \
   J	  K
   
     */
    	/*
    	 * 左边树
    	 */
    	BTNode j = new BTNode('J');
    	BTNode g = new BTNode('G',j,null);
    	BTNode e = new BTNode('E',g,null);
    	BTNode d = new BTNode('D');
    	BTNode b = new BTNode('B',d,e);
    	
    	/*
    	 * 右边树
    	 */
    	BTNode k = new BTNode('K');
    	BTNode n = new BTNode('N',null,k);
    	BTNode i = new BTNode('I');
    	BTNode f = new BTNode('F',n,i);
    	BTNode c = new BTNode('C',null,f);
    	BTNode h = new BTNode('A',b,c);
    	
        return h;// root
    }
    /**
     *  访问节点,打印操作
     * @author lengzl
     * @email 819681951@qq.com
     * @create 2017年2月9日 下午3:19:50
     * @param p
     */
    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();
        }
    }
    /** 
     * 非递归实现中序遍历
     * 左-右-根
     * @author lengzl
     * @email 819681951@qq.com
     * @create 2017年2月9日 下午4:59:19
     * @param p
     */
    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();
    }
}

二叉树节点 BTNode
package edu.yhf.demo.binaryTree;
/** 二叉树节点 */
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;
    }
}

树I显示结果:
(前序排列)Pre-Order:H D B A C G F E
(中序排列)In-Order:B A D C H G E F
(后序排列)Post-Order:A B C D E F G H
(前序排列-非递归调用)Pre-Order:H D B A C G F E
(中序排列-非递归调用)In-Order:B A D C H G E F
(后序排列-非递归调用)Post-Order:A B C D E F G H

树II显示结果
(前序排列)Pre-Order:A B D E G J C F N K I
(中序排列)In-Order:D B J G E A C N K F I
(后序排列)Post-Order:D J G E B K N I F C A
(前序排列-非递归调用)Pre-Order:A B D E G J C F N K I
(中序排列-非递归调用)In-Order:D B J G E A C N K F I
(后序排列-非递归调用)Post-Order:D J G E B K N I F C A

说明:
    /*遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。 
      设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。 
      (1)先序遍历 
      访问根;按先序遍历左子树;按先序遍历右子树 
      (2)中序遍历 
      按中序遍历左子树;访问根;按中序遍历右子树 
      (3)后序遍历 
      按后序遍历左子树;按后序遍历右子树;访问根 
      (4)层次遍历 
      即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同)

个人感悟:

    */  

/--2017/2/28 11:21:51
1.前序很容易理解;
中序最易出错.
中序,后序遍历都是从最左侧的单位开始,比如:树II.
中序遍历第一个节点是D,而非J. ★$)
  • 大小: 106 KB
分享到:
评论

相关推荐

    二叉树先序遍历、中序遍历和后序遍历非递归算法 C++源码

    用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法

    C++ 二叉树的先序遍历、中序遍历和后序遍历非递归算法

    用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。

    二叉树后序遍历的非递归算法

    这是数据结构中二叉树的后序遍历的非递归算法的源代码。

    C语言实现二叉树的前序遍历(非递归)

    在深入探讨C语言实现二叉树的前序遍历(非递归)之前,我们首先应当理解何为二叉树以及前序遍历的基本概念。 ### 二叉树简介 ...在实际编程实践中,理解并掌握非递归遍历技巧对于优化算法性能至关重要。

    二叉树先序、中序、后序三种遍历的非递归算法

    二叉树三种遍历非递归算法 二叉树是一种常用的数据结构,它广泛应用于计算机科学和软件工程中。二叉树的遍历是指对二叉树中的每个结点进行访问的过程。常见的二叉树遍历方法有三种:先序遍历、中序遍历和后序遍历。...

    二叉树的遍历的非递归算法(C++模板实现)

    使用C++模板、类的技术实现了二叉树的中序遍历,在BC3.1已经测试成功

    二叉树遍历前序非递归算法

    C语言二叉树遍历前序非递归算法,简单易懂,正确无误

    二叉树先序、中序、后序遍历非递归算法

    ### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...

    数据结构 二叉树三种遍历的非递归算法(背诵版).doc

    本资料“数据结构 二叉树三种遍历的非递归算法(背诵版)”着重介绍了二叉树的三种主要遍历方法——前序遍历、中序遍历和后序遍历的非递归实现。 **前序遍历**: 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。非...

    中序遍历二叉树非递归算法 栈实现代码

    //二叉树的二叉链表存储表示 typedef struct BiTNode { TElemType data; BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTree; typedef struct { BiTree *base; BiTree *top; int stacksize; //当前...

    二叉树前序、中序、后序三种遍历的非递归算法(C语言)

    ### 前序遍历非递归算法 前序遍历的顺序是:根节点→左子树→右子树。在非递归实现中,我们利用栈来辅助完成这一过程。首先,将根节点压入栈中,然后持续访问当前节点并将其左孩子压入栈,直到遇到空节点。此时,从...

    二叉树遍历的非递归算法分析与实现

    ### 二叉树遍历的非递归算法分析与实现 #### 一、引言 在数据结构领域中,二叉树作为一种基本的数据组织形式,其应用极为广泛。对于二叉树的操作,其中最重要的就是遍历操作。遍历是指按照特定顺序访问二叉树的...

    中序遍历二叉树非递归算法

    `creat()`函数用于构建二叉树,而`inorder()`函数则实现了上述的中序遍历非递归算法。在`inorder()`函数中,可以看到栈的使用以及对当前节点的处理逻辑,这些都遵循了上述算法步骤。 #### 5. 实践应用与优化 在实际...

    先序遍历非递归算法(C语言)

    根据给定的信息,本文将详细解释三种二叉树非递归遍历算法的实现方法:先序遍历、中序遍历以及后序遍历,并重点介绍先序遍历的非递归算法在C语言中的具体实现。 ### 先序遍历非递归算法(C语言) #### 1. 算法概述...

    二叉树后序遍历的非递归算法。

    二叉树后序遍历的非递归算法 二叉树后序遍历的非递归算法是指在遍历二叉树时,不使用递归函数,而是使用栈来存储结点的方法。该算法的主要思想是使用一个栈来存储结点,通过标志 flag 区分同一个结点的两次出栈。 ...

    按层次遍历二叉树的算法

    以下是按层次遍历二叉树的算法实现: ```c void lev_traverse(TNODE *T) { TNODE *q[100]; int head, tail, i; q[0] = T; head = 0; tail = 1; while (head ) { p = q[head++]; printf("%c", T-&gt;data); if...

    先序遍历的非递归算法

    本文将详细介绍二叉树的先序遍历非递归算法,包括其原理、实现代码和相关知识点。 知识点1:二叉树的概念 二叉树是一种特殊的树形结构,每个节点最多有两个孩子节点:左孩子和右孩子。二叉树可以用于表示各种树形...

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

    下面将详细介绍这些遍历方法及其递归和非递归实现。 1. **前序遍历**: - **描述**:前序遍历的顺序是“根-左-右”。首先访问根节点,然后递归地访问左子树,最后访问右子树。 - **递归实现**: ```java void ...

    二叉树递归遍历,非递归遍历,按层次遍历

    本篇文章将深入探讨二叉树的三种遍历方法:递归遍历(前序、中序、后序)、非递归遍历以及层次遍历。 1. **递归遍历**: - **前序遍历**:先访问根节点,然后递归地遍历左子树,最后遍历右子树。用公式表示为:根-...

    自己编写的实验二叉树的后序遍历非递归算法c语言实现

    在计算机科学领域,二叉树是一种...总之,二叉树的遍历是数据结构与算法的基础,掌握递归和非递归的实现方法对提升编程技能和解决复杂问题的能力大有裨益。在实践中不断优化和改进代码,可以更好地理解和运用这些概念。

Global site tag (gtag.js) - Google Analytics