`

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

 
阅读更多

Binary.java

import java.util.Stack;

public class BinaryTree {
protected Node root;

public BinaryTree(Node root) {
   this.root = root;
}

public Node getRoot() {
   return root;
}

/** 构造树 */
public static Node init() {
   Node a = new Node('A');
   Node b = new Node('B', null, a);
   Node c = new Node('C');
   Node d = new Node('D', b, c);
   Node e = new Node('E');
   Node f = new Node('F', e, null);
   Node g = new Node('G', null, f);
   Node h = new Node('H', d, g);
   return h;// root
}

/** 访问节点 */
public static void visit(Node p) {
   System.out.print(p.getKey() + " ");
}

/** 递归实现前序遍历 */
protected static void preorder(Node p) {
   if (p != null) {
    visit(p);
    preorder(p.getLeft());
    preorder(p.getRight());
   }
}

/** 递归实现中序遍历 */
protected static void inorder(Node p) {
   if (p != null) {
    inorder(p.getLeft());
    visit(p);
    inorder(p.getRight());
   }
}

/** 递归实现后序遍历 */
protected static void postorder(Node p) {
   if (p != null) {
    postorder(p.getLeft());
    postorder(p.getRight());
    visit(p);
   }
}

/** 非递归实现前序遍历 */
protected static void iterativePreorder(Node p) {
   Stack<Node> stack = new Stack<Node>();
   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());
    }
   }
}

/** 非递归实现前序遍历2 */
protected static void iterativePreorder2(Node p) {
   Stack<Node> stack = new Stack<Node>();
   Node node = p;
   while (node != null || stack.size() > 0) {
    while (node != null) {//压入所有的左节点,压入前访问它
     visit(node);
     stack.push(node);
     node = node.getLeft();
    }
    if (stack.size() > 0) {//
     node = stack.pop();
     node = node.getRight();
    }
   }
}

/** 非递归实现后序遍历 */
protected static void iterativePostorder(Node p) {
   Node q = p;
   Stack<Node> stack = new Stack<Node>();
   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();
   }
}

/** 非递归实现后序遍历 双栈法 */
protected static void iterativePostorder2(Node p) {
   Stack<Node> lstack = new Stack<Node>();
   Stack<Node> rstack = new Stack<Node>();
   Node node = p, right;
   do {
    while (node != null) {
     right = node.getRight();
     lstack.push(node);
     rstack.push(right);
     node = node.getLeft();
    }
    node = lstack.pop();
    right = rstack.pop();
    if (right == null) {
     visit(node);
    } else {
     lstack.push(node);
     rstack.push(null);
    }
    node = right;
   } while (lstack.size() > 0 || rstack.size() > 0);
}

/** 非递归实现后序遍历 单栈法*/
protected static void iterativePostorder3(Node p) {
   Stack<Node> stack = new Stack<Node>();
   Node node = p, prev = p;
   while (node != null || stack.size() > 0) {
    while (node != null) {
     stack.push(node);
     node = node.getLeft();
    }
    if (stack.size() > 0) {
     Node temp = stack.peek().getRight();
     if (temp == null || temp == prev) {
      node = stack.pop();
      visit(node);
      prev = node;
      node = null;
     } else {
      node = temp;
     }
    }

   }
}

/** 非递归实现后序遍历4 双栈法*/
protected static void iterativePostorder4(Node p) {
   Stack<Node> stack = new Stack<Node>();
   Stack<Node> temp = new Stack<Node>();
   Node node = p;
   while (node != null || stack.size() > 0) {
    while (node != null) {
     temp.push(node);
     stack.push(node);
     node = node.getRight();
    }
    if (stack.size() > 0) {
     node = stack.pop();
     node = node.getLeft();
    }
   }
   while (temp.size() > 0) {
    node = temp.pop();
    visit(node);
   }
}

/** 非递归实现中序遍历 */
protected static void iterativeInorder(Node p) {
   Stack<Node> stack = new Stack<Node>();
   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;
   }
}

/** 非递归实现中序遍历2 */
protected static void iterativeInorder2(Node p) {
   Stack<Node> stack = new Stack<Node>();
   Node node = p;
   while (node != null || stack.size() > 0) {
    while (node != null) {
     stack.push(node);
     node = node.getLeft();
    }
    if (stack.size() > 0) {
     node = stack.pop();
     visit(node);
     node = node.getRight();
    }
   }
}

/**
* @param args
*/
public static void main(String[] args) {
   BinaryTree tree = new BinaryTree(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("Pre-Order2:");
   iterativePreorder2(tree.getRoot());
   System.out.println();
   System.out.print(" In-Order:");
   iterativeInorder(tree.getRoot());
   System.out.println();
   System.out.print(" In-Order2:");
   iterativeInorder2(tree.getRoot());
   System.out.println();
   System.out.print(" Post-Order:");
   iterativePostorder(tree.getRoot());
   System.out.println();
   System.out.print("Post-Order2:");
   iterativePostorder2(tree.getRoot());
   System.out.println();
   System.out.print("Post-Order3:");
   iterativePostorder3(tree.getRoot());
   System.out.println();
   System.out.print("Post-Order4:");
   iterativePostorder4(tree.getRoot());
   System.out.println();

}

}

 

Node.java

public class Node {
private char key;
private Node left, right;

public Node(char key) {
   this(key, null, null);
}

public Node(char key, Node left, Node right) {
   this.key = key;
   this.left = left;
   this.right = right;
}

public char getKey() {
   return key;
}

public void setKey(char key) {
   this.key = key;
}

public Node getLeft() {
   return left;
}

public void setLeft(Node left) {
   this.left = left;
}

public Node getRight() {
   return right;
}

public void setRight(Node right) {
   this.right = right;
}
}

分享到:
评论

相关推荐

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

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

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

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

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

    前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -&gt; 左子树 -&gt; 右子树”。具体而言,在遍历过程中,首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。对于非递归的前序遍历,通常会利用栈来辅助实现...

    二叉树的递归遍历、非递归遍历和层次遍历

    自己写得二叉树的遍历程序,包括递归遍历,栈的非递归遍历和队列的层次遍历,已在VC中运行通过,希望以此与大家交流交流,如有不妥之处希望大家能帮我修正,本着共同进步的目的。

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

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

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

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

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

    编写先序遍历二叉树的非递归算法程序,要求: (1)以二叉链表建立二叉树。 (2)输出遍历的结点序列。 (3)有实例验算。

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

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

    实现先序,中序和后序遍历的二叉树遍历程序

    二叉树遍历的实现通常使用递归方法,也可以用栈来实现非递归版本。递归版本的代码相对简洁,而栈版本则更适用于处理深度较大的树,避免了调用栈溢出的问题。以下是每种遍历方法的基本伪代码: ```python # 递归版本...

    二叉树非递归遍历程序

    根据给定的信息,本文将详细解释“二叉树非递归遍历程序”的知识点,包括非递归前序遍历的实现方式,并对该程序代码进行分析。 ### 题目概述 二叉树是一种常见的数据结构,在计算机科学中有广泛的应用。在本篇文档...

    数据结构 二叉树遍历程序

    二叉树遍历程序的编写涉及链表操作、指针传递以及递归(或迭代)逻辑,对于学习数据结构和算法的初学者来说具有挑战性。在实际编程中,为了提高效率,我们通常会考虑优化遍历过程,例如使用尾递归、减少栈空间的使用...

    二叉树递归非递归遍历 c语言源程序

    通过以上知识点,我们可以清楚地了解到二叉树遍历的基本原理以及其实现方法,包括递归与非递归两种实现方式。这些方法不仅适用于C语言,也适用于其他支持栈操作的语言。在实际应用中,选择哪种遍历方法取决于具体的...

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

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

    数据结构试验报告用先序中序建立二叉树后序遍历非递归.pdf

    后序遍历非递归算法的实现相对复杂,需要利用栈的操作来实现。 4. 结构体的定义和使用:在C语言的实现中,结构体(struct)被用来定义树节点,其中包含了数据域(如字符型的data域)和指针域(lchild和rchild分别...

    二叉树遍历_C语言_

    之后,程序将执行非递归的中序遍历,递归的后序遍历,以及层序遍历,打印出相应的节点顺序。这涉及到对二叉树遍历算法的灵活应用。 为了调试和优化代码,文件"二叉树.dsp"、"二叉树.opt"和"二叉树.plg"可能是Visual...

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

    后序遍历是二叉树遍历的一种方式,它按照“左子树-右子树-根节点”的顺序访问每个节点。在递归方式下,后序遍历相对直观,但非递归实现则需要更巧妙的策略,如使用栈来模拟递归调用的过程。 这个实验中,我们主要...

    二叉树遍历的特点(数据结构)C语言描述

    ### 二叉树遍历的特点(数据结构) 在计算机科学领域,数据结构是研究的核心之一。其中,二叉树作为一种重要的非线性数据结构,在实际应用中极为广泛,包括搜索算法、排序算法等方面都有其身影。本文将详细介绍...

    二叉树的遍历的算法:递归与非递归

    二叉树遍历是计算机科学中的一个重要概念,主要应用于数据结构和算法领域。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的遍历是指按照特定顺序访问每个节点的...

Global site tag (gtag.js) - Google Analytics