- 浏览: 54933 次
- 性别:
- 来自: 北京
文章分类
最新评论
Binary.java import java.util.Stack; public class BinaryTree { public BinaryTree(Node root) { public Node getRoot() { /** 构造树 */ /** 访问节点 */ /** 递归实现前序遍历 */ /** 递归实现中序遍历 */ /** 递归实现后序遍历 */ /** 非递归实现前序遍历 */ /** 非递归实现前序遍历2 */ /** 非递归实现后序遍历 */ /** 非递归实现后序遍历 双栈法 */ /** 非递归实现后序遍历 单栈法*/ } /** 非递归实现后序遍历4 双栈法*/ /** 非递归实现中序遍历 */ /** 非递归实现中序遍历2 */ /** } } Node.java public class Node { public Node(char key) { public Node(char key, Node left, Node right) { public char getKey() { public void setKey(char key) { public Node getLeft() { public void setLeft(Node left) { public Node getRight() { public void setRight(Node right) {
protected Node root;
this.root = root;
}
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());
}
}
}
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;
}
}
}
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;
}
}
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();
private char key;
private Node left, right;
this(key, null, null);
}
this.key = key;
this.left = left;
this.right = right;
}
return key;
}
this.key = key;
}
return left;
}
this.left = left;
}
return right;
}
this.right = right;
}
}
发表评论
-
经典面试题
2011-11-22 23:21 660一、请你自我介绍一下 ... -
往年汤森路透上机题
2011-11-15 09:23 1377c++类:main()的标准形式? 在最新的 C99 标准中 ... -
什么是索引?索引有哪几种?
2011-11-10 16:01 1424索引用来快速地寻找那些具有特定值的记录,所有MySQL索引 ... -
Struts 的工作原理
2011-11-06 22:49 846Struts1的流程 服务器启动后,根据web.xml加载A ... -
android 面试题经典
2011-10-22 00:34 6061、 Android dvm的进程和Linux的进程, 应 ... -
恼人的设计模式
2011-10-15 23:20 627最近参加面试,总是被问到设计模式的问题。本人作为一个实用派 ... -
链表相关面试题
2011-10-06 10:46 788题一、 给定单链表,检 ... -
二叉树的算法
2011-10-04 17:37 1933声明,本文所有11道算法题目,覆盖了基本上所有常见的二叉树 ... -
SSH面试题总结
2011-09-28 23:31 621Hibernate工作原理及为什么要用? 原理: 1. ... -
百度2011笔试题
2011-09-27 11:00 7042011年校园招聘笔试题(一) (测试题目答题时间90分钟, ... -
约瑟夫环问题
2011-09-23 16:08 992在一只热气球上有15个日本人和15个美国人,由于热气球超重,必 ... -
联发科技笔试题
2011-09-23 10:20 1129public class Dims { /** ... -
往年EMC编程题答案
2011-09-22 14:24 6921 Write a function to find the ... -
“火柴棍式”程序员面试题
2011-09-21 22:18 937“火柴棍式”程序员面试题 2011年03月21日 星期一 ... -
华为机考
2011-09-21 16:39 15231. 判断回文 public class Huiwen { ... -
求最长的回文字符串
2011-09-21 16:28 1648程序:输入:一行字符串,输出:最长的回文字符的长度以及把它们 ... -
Java的GC工作原理
2011-09-05 15:45 654GC的基本原理 Java的内存管理实际上就是对象 ... -
String 转 Date
2011-08-12 15:32 695DateFormat format = new SimpleD ... -
对于JAVA基础知识精华总结
2011-07-26 13:58 6341、 对象的初始化 (1) 非静态对象的初始化 ... -
讨论关于Java占用内存的研究
2011-07-26 13:55 615最近对程序占用内存方面做了一些优化,取得了不错的效果,总结了一 ...
相关推荐
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
前序遍历是二叉树遍历的一种方式,其顺序为“根节点 -> 左子树 -> 右子树”。具体而言,在遍历过程中,首先访问根节点,然后递归地遍历左子树,最后递归地遍历右子树。对于非递归的前序遍历,通常会利用栈来辅助实现...
自己写得二叉树的遍历程序,包括递归遍历,栈的非递归遍历和队列的层次遍历,已在VC中运行通过,希望以此与大家交流交流,如有不妥之处希望大家能帮我修正,本着共同进步的目的。
### 二叉树遍历的非递归算法分析与实现 #### 一、引言 在数据结构领域中,二叉树作为一种基本的数据组织形式,其应用极为广泛。对于二叉树的操作,其中最重要的就是遍历操作。遍历是指按照特定顺序访问二叉树的...
### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...
编写先序遍历二叉树的非递归算法程序,要求: (1)以二叉链表建立二叉树。 (2)输出遍历的结点序列。 (3)有实例验算。
//二叉树的二叉链表存储表示 typedef struct BiTNode { TElemType data; BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTree; typedef struct { BiTree *base; BiTree *top; int stacksize; //当前...
二叉树遍历的实现通常使用递归方法,也可以用栈来实现非递归版本。递归版本的代码相对简洁,而栈版本则更适用于处理深度较大的树,避免了调用栈溢出的问题。以下是每种遍历方法的基本伪代码: ```python # 递归版本...
根据给定的信息,本文将详细解释“二叉树非递归遍历程序”的知识点,包括非递归前序遍历的实现方式,并对该程序代码进行分析。 ### 题目概述 二叉树是一种常见的数据结构,在计算机科学中有广泛的应用。在本篇文档...
二叉树遍历程序的编写涉及链表操作、指针传递以及递归(或迭代)逻辑,对于学习数据结构和算法的初学者来说具有挑战性。在实际编程中,为了提高效率,我们通常会考虑优化遍历过程,例如使用尾递归、减少栈空间的使用...
通过以上知识点,我们可以清楚地了解到二叉树遍历的基本原理以及其实现方法,包括递归与非递归两种实现方式。这些方法不仅适用于C语言,也适用于其他支持栈操作的语言。在实际应用中,选择哪种遍历方法取决于具体的...
### 前序遍历非递归算法 前序遍历的顺序是:根节点→左子树→右子树。在非递归实现中,我们利用栈来辅助完成这一过程。首先,将根节点压入栈中,然后持续访问当前节点并将其左孩子压入栈,直到遇到空节点。此时,从...
后序遍历非递归算法的实现相对复杂,需要利用栈的操作来实现。 4. 结构体的定义和使用:在C语言的实现中,结构体(struct)被用来定义树节点,其中包含了数据域(如字符型的data域)和指针域(lchild和rchild分别...
之后,程序将执行非递归的中序遍历,递归的后序遍历,以及层序遍历,打印出相应的节点顺序。这涉及到对二叉树遍历算法的灵活应用。 为了调试和优化代码,文件"二叉树.dsp"、"二叉树.opt"和"二叉树.plg"可能是Visual...
后序遍历是二叉树遍历的一种方式,它按照“左子树-右子树-根节点”的顺序访问每个节点。在递归方式下,后序遍历相对直观,但非递归实现则需要更巧妙的策略,如使用栈来模拟递归调用的过程。 这个实验中,我们主要...
### 二叉树遍历的特点(数据结构) 在计算机科学领域,数据结构是研究的核心之一。其中,二叉树作为一种重要的非线性数据结构,在实际应用中极为广泛,包括搜索算法、排序算法等方面都有其身影。本文将详细介绍...
二叉树遍历是计算机科学中的一个重要概念,主要应用于数据结构和算法领域。二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,通常称为左子节点和右子节点。二叉树的遍历是指按照特定顺序访问每个节点的...