先序遍历结果:- + a * - b c d / e f
中序遍历结果:a + b - c * d - e / f
后序遍历结果:a b c - d * + e f / -
层次遍历结果:- + / a * e f - d b c
package lengreen.struct.other;
import lengreen.struct.Iterator;
import lengreen.struct.LinkedList;
import lengreen.struct.Queue;
import lengreen.struct.Stack;
import lengreen.struct.impl.ArrayQueue;
import lengreen.struct.impl.BinaryTreeNode;
import lengreen.struct.impl.DoubleLinkedList;
import lengreen.struct.impl.SingleLinkedStack;
public class BinaryTreeTest {
private BinaryTreeNode root;
public static void main(String[] args) {
BinaryTreeTest bt = new BinaryTreeTest();
bt.genRoot();
// Iterator it = bt.midOrder(bt.root, new DoubleLinkedList());
// Iterator it = bt.lastOrder(bt.root, new DoubleLinkedList());
// Iterator it = bt.preOrder(bt.root, new DoubleLinkedList());
Iterator it = bt.levelOrder(bt.root, new DoubleLinkedList());
// Iterator it = bt.order(1);
while (!it.isDone()) {
BinaryTreeNode btn = (BinaryTreeNode) it.currentItem();
System.out.print(btn.getData().toString() + " ");
it.next();
}
}
// 层次遍历
public Iterator levelOrder(BinaryTreeNode rt, LinkedList list) {
if (rt == null) {
return null;
}
Queue q = new ArrayQueue();
BinaryTreeNode p = null;
q.enqueue(rt);
while (!q.isEmpty()) {
p = (BinaryTreeNode) q.dequeue();// 取出队首元素,访问之
list.insertLast(p);
if (p.hasLeftChild()) {
q.enqueue(p.getLeftChild());// 如果左节点存在,放入队列中
}
if (p.hasRightChild()) {
q.enqueue(p.getRightChild());// 如果右节点存在,放入队列中
}
}
return list.elements();
}
// 二叉树遍历的递归算法
public void orderRecursion(BinaryTreeNode rt, LinkedList list, int orderby) {
if (rt == null)
return; // 递归基,空树直接返回
switch (orderby) {
case 1: // 先序遍历访问根结点
list.insertLast(rt);
orderRecursion(rt.getLeftChild(), list, orderby); // 遍历左子树
orderRecursion(rt.getRightChild(), list, orderby); // 遍历右子树
break;
case 2: // 中序遍历访问根结点
orderRecursion(rt.getLeftChild(), list, orderby); // 遍历左子树
list.insertLast(rt);
orderRecursion(rt.getRightChild(), list, orderby); // 遍历右子树
break;
case 3: // 后续遍历访问根结点
orderRecursion(rt.getLeftChild(), list, orderby); // 遍历左子树
orderRecursion(rt.getRightChild(), list, orderby); // 遍历右子树
list.insertLast(rt);
break;
}
}
// 二叉树先序遍历非递归算法
public Iterator preOrder(BinaryTreeNode bt, LinkedList list) {
Stack s = new SingleLinkedStack();
BinaryTreeNode p = bt;// 找到最左节点
while (p != null) {
while (p != null) {
list.insertLast(p);// 访问根节点
if (p.hasRightChild()) {// 右子树压栈
s.push(p.getRightChild());
}
p = p.getLeftChild();// 继续访问左子树直到为空
}
if (!s.isEmpty()) {
p = (BinaryTreeNode) s.pop();// 当当前左子树遍历完成,存右子树的栈退栈
}
}
return list.elements();
}
// 找到最左节点
private BinaryTreeNode goFarLeft(BinaryTreeNode bt, Stack s) {
if (bt == null) {
return null;
}
while (bt.hasLeftChild()) {
s.push(bt);
bt = bt.getLeftChild();
}
return bt;
}
// 二叉树中序遍历的非递归算法
public Iterator midOrder(BinaryTreeNode bt, LinkedList list) {
Stack s = new SingleLinkedStack();
BinaryTreeNode p = goFarLeft(bt, s);// 找到最左节点
// 如果最左节点不为空则继续查找
while (p != null) {
// 中序访问当前节点
list.insertLast(p);
if (p.hasRightChild()) {
// 如果有右孩子节点,则访问有孩子节点的最左孩子节点
p = goFarLeft(p.getRightChild(), s);
} else if (!s.isEmpty()) {
// 如果没有右孩子节点且栈不为空,则弹栈往回找上一级
p = (BinaryTreeNode) s.pop();
} else {
p = null;// 栈为空则查找完成
}
}
return list.elements();
}
// 二叉树后序遍历非递归算法
public Iterator lastOrder(BinaryTreeNode bt, LinkedList list) {
Stack s = new SingleLinkedStack();
BinaryTreeNode p = bt;// 找到最左节点
BinaryTreeNode pre = null;// 缓存上次访问节点
// 如果最左节点不为空则继续查找
while (p != null || !s.isEmpty()) {
while (p != null) {// 查找最左节点
s.push(p);
p = p.getLeftChild();
}
if (!s.isEmpty()) {
// 取出栈顶节点
p = (BinaryTreeNode) s.peek();
// 判断当前节点是否是父亲节点的右子节点,如果是
// 只需访问其父节点即可完成以p的父节点为根节点的子树的访问
if (!p.hasRightChild() || p.getRightChild() == pre) {
list.insertLast(p);
s.pop();
pre = p;
p = null;
} else {
p = p.getRightChild();
}
}
}
return list.elements();
}
private void genRoot() {
root = new BinaryTreeNode("-");
BinaryTreeNode a = new BinaryTreeNode("a");
BinaryTreeNode b = new BinaryTreeNode("b");
BinaryTreeNode c = new BinaryTreeNode("c");
BinaryTreeNode d = new BinaryTreeNode("d");
BinaryTreeNode e = new BinaryTreeNode("e");
BinaryTreeNode f = new BinaryTreeNode("f");
BinaryTreeNode plus = new BinaryTreeNode("+");
BinaryTreeNode minus = new BinaryTreeNode("-");
BinaryTreeNode multiply = new BinaryTreeNode("*");
BinaryTreeNode except = new BinaryTreeNode("/");
root.setLeftChild(plus);
root.setRightChild(except);
plus.setLeftChild(a);
plus.setRightChild(multiply);
multiply.setLeftChild(minus);
multiply.setRightChild(d);
minus.setLeftChild(b);
minus.setRightChild(c);
except.setLeftChild(e);
except.setRightChild(f);
}
}
- 描述: 二叉树结构
- 大小: 9.6 KB
分享到:
相关推荐
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
常见的二叉树遍历方式有先序遍历、中序遍历和后序遍历。 先序遍历是一种常见的二叉树遍历方式,它的遍历顺序是先访问根结点,然后遍历左子树和右子树。例如,given a binary tree: A / \ B C / \ \ D E F 其...
### 二叉树先序、中序、后序遍历非递归算法 #### 前言 在计算机科学中,二叉树是一种常见的数据结构,它被广泛应用于各种算法和程序设计中。二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:...
根据提供的标题、描述以及部分代码内容,我们可以总结出关于二叉树非递归遍历算法的相关知识点。 ### 一、二叉树非递归遍历算法概述 在数据结构的学习中,二叉树是非常重要的一个概念,而遍历是访问二叉树节点的一...
常见的二叉树遍历方法有三种:先序遍历、中序遍历和后序遍历。下面我们将讨论这三种遍历方法的非递归算法。 一、先序遍历非递归算法 先序遍历是指先访问根结点,然后访问左子树,最后访问右子树。非递归算法使用栈...
数据结构二叉树链式结构的前序遍历,中序遍历,后序遍历用递归的方法,层级遍历采用队列结构
本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...
(1)输入字符序列,建立二叉链表 (2)中序遍历二叉树:递归 (3)中序遍历二叉树:非递归 (3)二叉树高度
本文将详细介绍二叉树的先序、中序和后序遍历,以及如何通过递归和非递归(迭代)的方式来实现这些遍历方法。 **先序遍历(Preorder Traversal)** 先序遍历的顺序是:根节点 -> 左子树 -> 右子树。递归实现时,...
二叉树先序、中序、后序三种遍历的非递归算法 二叉树遍历是数据结构中的一种基础算法,以树状结构为基础,通过对树的遍历来实现数据的访问和处理。常见的二叉树遍历算法有三种:先序遍历、中序遍历和后序遍历。这些...
根据以上知识点,我们可以总结出该实验报告主要涉及构建二叉树(特别是基于先序和中序遍历序列),以及利用栈实现二叉树的后序遍历算法。在实现过程中,采用了C语言的结构体和指针操作,以及标准输入输出函数。这些...
以上介绍了二叉树遍历的六种方法:递归和非递归版本的先序遍历、中序遍历以及后序遍历。这些遍历方法在不同的应用场景中有着不同的用途。例如,在搜索问题中可能更倾向于使用先序遍历;而在排序问题中,则通常会采用...
在本话题中,我们将深入探讨非递归方式实现的先序、中序和后序遍历,以及它们在MFC(Microsoft Foundation Classes)框架下的应用。 1. **先序遍历**:先序遍历的顺序是“根-左-右”,即首先访问根节点,然后递归地...
中序遍历的顺序是递归地进行左子树的中序遍历,然后访问根节点,最后递归地进行右子树的中序遍历。实现代码如下: ```c void Inoder(BiTree T) { if (T != NULL) { Inoder(T->lchild); // 递归遍历左子树 printf...
二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历、计算叶子节点数目和所有节点数目,使用队列实现二叉树的层次遍历.zip
这里我们将详细讨论三种主要的遍历方法:先序遍历、中序遍历和后序遍历,以及如何使用递归和非递归方法实现它们。 **先序遍历** 是一种访问二叉树节点的方法,其顺序为:根节点 -> 左子树 -> 右子树。递归实现先序...
在本课程设计中,我们将探讨如何使用C++编程语言来构建和操作二叉树,特别是通过先序遍历建立二叉树以及非递归方式实现中序遍历。这一过程涉及到了数据结构中的核心概念——二叉链表,以及递归和非递归算法的应用。 ...
根据给定文件的信息,本文将详细介绍二叉树的创建及三种基本的递归遍历方法:先序遍历、中序遍历和后序遍历。 ### 一、二叉树的基本概念 二叉树是一种非线性数据结构,每个节点最多有两个子节点,通常称为左子节点...