zoukankan      html  css  js  c++  java
  • 数据结构——二叉树

    以下是创建的二叉树模型

    创建树

    package com.demo.tree;
    
    public class Node {
        private int data;  
        private Node leftNode;  //左节点
        private Node rightNode; //右节点 
        public Node(int data, Node leftNode, Node rightNode){  
            this.data = data;  
            this.leftNode = leftNode;  
            this.rightNode = rightNode;  
        }  
      
        public int getData() {  
            return data;  
        }  
        public void setData(int data) {  
            this.data = data;  
        }  
        public Node getLeftNode() {  
            return leftNode;  
        }  
        public void setLeftNode(Node leftNode) {  
            this.leftNode = leftNode;  
        }  
        public Node getRightNode() {  
            return rightNode;  
        }  
        public void setRightNode(Node rightNode) {  
            this.rightNode = rightNode;  
        }  
    }

    非递归方式

    package com.demo.tree;
    
    import java.util.Stack;
    
    public class BinaryTree {
        public Node init() {// 注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错
            Node J = new Node(8, null, null);
            Node H = new Node(4, null, null);
            Node G = new Node(2, null, null);
            Node F = new Node(7, null, J);
            Node E = new Node(5, H, null);
            Node D = new Node(1, null, G);
            Node C = new Node(9, F, null);
            Node B = new Node(3, D, E);
            Node A = new Node(6, B, C);
            return A; // 返回根节点
        }
    
        public void printNode(Node node) {
            System.out.print(node.getData());
        }
    
        public void theFirstTraversal_Stack(Node root) { // 先序遍历
            Stack<Node> stack = new Stack<Node>();
            Node node = root;
            while (node != null || stack.size() > 0) { // 将所有左孩子压栈
                if (node != null) { // 压栈之前先访问
                    printNode(node);
                    stack.push(node);
                    node = node.getLeftNode();
                } else {
                    node = stack.pop();
                    node = node.getRightNode();
                }
            }
        }
    
        public void theInOrderTraversal_Stack(Node root) { // 中序遍历
            Stack<Node> stack = new Stack<Node>();
            Node node = root;
            while (node != null || stack.size() > 0) {
                if (node != null) {
                    stack.push(node); // 直接压栈
                    node = node.getLeftNode();
                } else {
                    node = stack.pop(); // 出栈并访问
                    printNode(node);
                    node = node.getRightNode();
                }
            }
        }
    
        public void thePostOrderTraversal_Stack(Node root) { // 后序遍历
            Stack<Node> stack = new Stack<Node>();
            Stack<Node> output = new Stack<Node>();// 构造一个中间栈来存储逆后序遍历的结果
            Node node = root;
            while (node != null || stack.size() > 0) {
                if (node != null) {
                    output.push(node);
                    stack.push(node);
                    node = node.getRightNode();
                } else {
                    node = stack.pop();
                    node = node.getLeftNode();
                }
            }
            System.out.println(output.size());
            while (output.size() > 0) {
    
                printNode(output.pop());
            }
        }
    
        public static void main(String[] args) {
            BinaryTree tree = new BinaryTree();
            Node root = tree.init();
            System.out.println("先序遍历");
            tree.theFirstTraversal_Stack(root);
            System.out.println("");
            System.out.println("中序遍历");
            tree.theInOrderTraversal_Stack(root);
            System.out.println("");
            System.out.println("后序遍历");
            tree.thePostOrderTraversal_Stack(root);
            System.out.println("");
        }
    }

    输出结果:

    先序遍历
    631254978
    中序遍历
    123456789
    后序遍历
    214538796

    递归模式

    public class BinaryTree {  
        /** 
         * @author yaobo
         * 二叉树的先序中序后序排序 
         */  
        public Node init() {//注意必须逆序建立,先建立子节点,再逆序往上建立,因为非叶子结点会使用到下面的节点,而初始化是按顺序初始化的,不逆序建立会报错  
            Node J = new Node(8, null, null);  
            Node H = new Node(4, null, null);  
            Node G = new Node(2, null, null);  
            Node F = new Node(7, null, J);  
            Node E = new Node(5, H, null);  
            Node D = new Node(1, null, G);  
            Node C = new Node(9, F, null);  
            Node B = new Node(3, D, E);  
            Node A = new Node(6, B, C);  
            return A;   //返回根节点  
        }
        
        public void printNode(Node node){  
            System.out.print(node.getData());  
        }  
        public void theFirstTraversal(Node root) {  //先序遍历  
            printNode(root);  
            if (root.getLeftNode() != null) {  //使用递归进行遍历左孩子  
                theFirstTraversal(root.getLeftNode());  
            }  
            if (root.getRightNode() != null) {  //递归遍历右孩子  
                theFirstTraversal(root.getRightNode());  
            }  
        }  
        public void theInOrderTraversal(Node root) {  //中序遍历  
            if (root.getLeftNode() != null) {  
                theInOrderTraversal(root.getLeftNode());  
            }  
            printNode(root);  
            if (root.getRightNode() != null) {  
                theInOrderTraversal(root.getRightNode());  
            }  
        }
        
        
        public void thePostOrderTraversal(Node root) {  //后序遍历  
            if (root.getLeftNode() != null) {  
                thePostOrderTraversal(root.getLeftNode());  
            }  
            if(root.getRightNode() != null) {  
                thePostOrderTraversal(root.getRightNode());  
            }  
            printNode(root);  
        }  
          
        public static void main(String[] args) {  
            BinaryTree tree = new BinaryTree();  
            Node root = tree.init();  
            System.out.println("先序遍历");  
            tree.theFirstTraversal(root);  
            System.out.println("");  
            System.out.println("中序遍历");  
            tree.theInOrderTraversal(root);  
            System.out.println("");  
            System.out.println("后序遍历");  
            tree.thePostOrderTraversal(root);  
            System.out.println("");  
        }  
    }
  • 相关阅读:
    用面向对象的方法重写选项卡
    js 深入理解原型模式
    ECMAScript中的两种属性
    引用类型
    js 变量、作用域和内存问题
    html5 canvas画布尺寸与显示尺寸
    网页画板制作
    了解数组中的队列方法,DOM中节点的一些操作
    JavaScript中的数组对象遍历、读写、排序等操作
    this在方法赋值过程中无法保持(隐式丢失)
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/8446269.html
Copyright © 2011-2022 走看看