二叉树遍历(java代码)
来源:互联网 发布:矩阵纵横官网 编辑:程序博客网 时间:2024/06/06 00:37
- /**
- * @author zky
- * 定义二叉树
- */
- 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;
- }
- }
- 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();
- }
- }
0 0
- 二叉树遍历(java代码)
- JAVA六种遍历二叉树代码
- java代码实现二叉树的遍历
- 遍历二叉树代码
- java二叉树遍历
- Java 二叉树遍历
- java遍历二叉树
- JAVA 二叉树遍历
- java 二叉树遍历
- JAVA遍历二叉树
- JAVA遍历二叉树
- 二叉树java遍历
- Java二叉树遍历
- JAVA 二叉树遍历
- Java二叉树遍历
- 二叉树遍历 java
- 用java代码实现二叉树的遍历算法
- 二叉树的四种遍历(java代码)
- passwd命令--Linux命令应用大词典729个命令解读
- 实现activity的滑动切换
- JS的 for in循环读取对象属性的顺序遵循的规则
- Deep Learning 笔记整理 2:深度学习过程介绍 1
- ipad 拍照没有声音的应用
- 二叉树遍历(java代码)
- Excel导入中文到MYSQL遇到无法导入以及导入后乱码问题
- Java设计模式之三——工厂模式
- oracle的imp导入时覆盖目标数据库
- SQL优化:设置执行计划的显示格式
- 享元设计模式例子
- [C]c语言中,scanf里面要是数组要不要加&?
- Deep Learning(深度学习)学习笔记整理系列之(七)
- LTE上行物理层传输机制(4)-UCI在PUCCH和PUSCH中的传输