二叉树:前序,后序,中序遍历(递归+非递归);层次(队列)
来源:互联网 发布:书生商友seo 编辑:程序博客网 时间:2024/05/30 12:30
import java.util.LinkedList;import java.util.Queue;import java.util.Stack;class Node { public int value; public Node left; public Node right; public Node(int v) { this.value = v; this.left = null; this.right = null; }}public class BinaryTreeTraversal { /* * 前序遍历主要思想: * 从根节点出发,沿着左子树向下搜索,没搜索到直接访问,并将其非空右孩子压栈。 * 当左子树访问完成,从栈顶弹出右孩子节点,进而遍历该节点的右子树。*/ /** *前序遍历,递归*/ public static void preOrderRec(Node root) { if (root != null) { System.out.println(root.value); preOrderRec(root.left); preOrderRec(root.right); } } /** * 前序遍历,非递归*/ public static void preOrderRec2(Node root) { if (root == null) return ; Stack<Node> s = new Stack<Node>(); Node temp = root; while (!s.empty()) { if (temp != null) { System.out.println(temp.value); s.push(temp); temp = temp.left; } else { temp = s.pop(); temp = temp.right; } } } /** * 中序遍历,递归*/ public static void inOrderRec(Node root) { if (root != null) { inOrderRec(root.left); System.out.println(root.value); inOrderRec(root.right); } } /** * 中序遍历,非递归*/ public static void inOrderRec2(Node root) { if (root == null) return ; Stack<Node> s = new Stack<Node>(); Node temp = root; while(! s.empty()) { if (temp != null) { s.push(temp); temp = temp.left; } else { temp = s.pop(); System.out.println(temp.value); temp = temp.right; } } } /** * 后序遍历,递归*/ public static void postOrderRec(Node root) { if (root != null) { postOrderRec(root.left); postOrderRec(root.right); System.out.println(root.value); } } /** * 后序遍历,非递归 * 后序遍历需要先处理左右子树,然后处理根(回溯),所以需要一个记录哪些点已经被访问的结构。 * 此处使用中间栈存储。*/ public static void postOrderRec2(Node root) { Stack<Node> s = new Stack<Node>(); Stack<Node> o = new Stack<Node>(); Node temp = root; while (! s.empty()) { if (temp != null) { o.push(temp); //先压根节点,输出才是最后 s.push(temp); temp = temp.right; } else { //没有右子节点,替换成根节点的左节点 temp = s.pop(); temp = temp.left; } } while (! o.isEmpty()) { System.out.println(o.pop().value); } } /** * 层次遍历基本思想: * 首先将根节点入队,然后每次从队列中取出对首元素进行处理。 * 每处理一个节点,都是先访问该节点,再按从左到右的顺序把它的孩子节点依次入对。*/ public static void levelRec(Node root) { Queue<Node> q = new LinkedList<>(); while (! q.isEmpty()) { Node temp = q.poll(); System.out.println(temp.value); if (temp.left != null) q.add(temp.left); if (temp.right != null) q.add(temp.right); } }}
阅读全文
0 0
- 二叉树:前序,后序,中序遍历(递归+非递归);层次(队列)
- 二叉树的非递归遍历以及层次遍历(前序、中序、后序)
- (C语言版)二叉树遍历算法——包含递归前、中、后序和层次,非递归前、中、后序和层次遍历共八种
- 二叉树遍历(前序、中序、后序、非递归中序、层次)
- 二叉树非递归前序,中序,后序,层次遍历
- 二叉树的非递归前序、中序、后序、层次遍历
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归) 层次遍历
- 二叉树的创建,遍历(前序,中序,后序)-递归 非递归
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 二叉树遍历(前序、中序、后序)递归与非递归
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的递归和非递归遍历(前序、中序、后序)
- 二叉树的前序、中序、后序遍历(递归&非递归)
- 二叉树的前序、中序、后序遍历(递归与非递归)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 二叉树的递归与非递归遍历(前序、中序、后序)
- 模拟实现容器适配器栈和队列
- 【实战】计算器的样式布局
- 第十一天(HTML5BASIC)
- 分析golang的slice排序
- 调用request请求返回xml
- 二叉树:前序,后序,中序遍历(递归+非递归);层次(队列)
- ajax的一些小问题
- 元素的显示隐藏
- 排序总结
- [堪称经典]JAVA多线程和并发基础面试问答
- 利用mvc 和数据结合来做mail 邮件系统
- Leetcode——第21题
- 51nod1483-技巧&标记&思维-化学变换
- mark