二叉树的非递归遍历
来源:互联网 发布:java 布尔类型 编辑:程序博客网 时间:2024/06/06 04:55
/** 二叉树节点 */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; }}/** 二叉树遍历 */public class BinTree { protected BTNode root; public BinTree(BTNode root) { this.root = root; } public BTNode getRoot() { return root; } /** 构造树 */ 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); return h;// root } /** 访问节点 */ 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(); } } /** 非递归实现中序遍历 */ 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(); }}遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示。
设L、D、R分别表示遍历左子树、访问根结点和遍历右子树, 则对一棵二叉树的遍历有三种情况:DLR(称为先根次序遍历),LDR(称为中根次序遍历),LRD (称为后根次序遍历)。
(1)先序遍历
访问根;按先序遍历左子树;按先序遍历右子树
(2)中序遍历
按中序遍历左子树;访问根;按中序遍历右子树
(3)后序遍历
按后序遍历左子树;按后序遍历右子树;访问根
(4)层次遍历
即按照层次访问,通常用队列来做。访问根,访问子女,再访问子女的子女(越往后的层次越低)(两个子女的级别相同)
思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。void HierarchyBiTree(BiTree Root){LinkQueue *Q; // 保存当前节点的左右孩子的队列InitQueue(Q); // 初始化队列if (Root == NULL) return ; //树为空则返回BiNode *p = Root; // 临时保存树根Root到指针p中Visit(p->data); // 访问根节点if (p->lchild) EnQueue(Q, p->lchild); // 若存在左孩子,左孩子进队列if (p->rchild) EnQueue(Q, p->rchild); // 若存在右孩子,右孩子进队列while (!QueueEmpty(Q)) // 若队列不空,则层序遍历 { DeQueue(Q, p); // 出队列Visit(p->data);// 访问当前节点if (p->lchild) EnQueue(Q, p->lchild); // 若存在左孩子,左孩子进队列if (p->rchild) EnQueue(Q, p->rchild); // 若存在右孩子,右孩子进队列}DestroyQueue(Q); // 释放队列空间return ;
- 二叉树的递归,非递归遍历
- 二叉树的递归+非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的遍历--递归+非递归
- 二叉树的递归、非递归遍历
- 二叉树的递归非递归遍历
- 二叉树的先中后序遍历,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归遍历,非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的非递归遍历以及递归遍历
- 二叉树的非递归遍历&递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的递归遍历与非递归遍历
- 二叉树的递归遍历和非递归遍历
- 二叉树的构造,递归遍历,非递归遍历
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的递归遍历与非递归遍历
- 初探Tomcat源码 (3) —— SimpleHttpServer
- WebSphere Process Server V7 集群 - 经典拓扑模型
- 杨辉三角
- 每天一点Linux
- opencv学习之(三)-LBP算法的研究及其实现
- 二叉树的非递归遍历
- git的使用之四
- 【转】运行游戏时出现0xc000007b错误的解决方法
- ics_cubieboard(A)相对 ics_cubieboard-tv-sdk(B) framework/base差异
- 第三章 Libgdx必备工具
- 程序员_Java高新技术<一>
- Servlet学习笔记1之通过实现Servlet接口开发一个HelloServ
- 使用iptables -S命令查看链中的规则
- Nginx反向代理以及配置优化