当前位置 博文首页 > fareast_mzh的博客:Binary Tree 非递归方式实现二叉树先序遍历

    fareast_mzh的博客:Binary Tree 非递归方式实现二叉树先序遍历

    作者:[db:作者] 时间:2021-08-13 15:58

    节点数据类型声明 Node.java

    package com.merrytech;
    
    public class Node implements Comparable {
        private Comparable value;
    
        private Node left;
        private Node right;
    
        public Node(Comparable value) {
            this.value = value;
            this.left = null;
            this.right = null;
        }
    
        public Comparable getValue() { return this.value; }
    
        @Override
        public int compareTo(Object o) {
            Node n = (Node)o;
            return this.value.compareTo(n.getValue());
        }
    
        public Node getLeft() { return this.left; }
        public Node getRight() { return this.right; }
    
        public void setLeft(Node left) { this.left = left; }
        public void setRight(Node right) { this.right = right; }
    }

    二叉查找树 BinarySearchTree.java

    package com.merrytech;
    
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.Stack;
    
    public class BinarySearchTree implements Comparable {
    
        private Node root;
    
        public BinarySearchTree() {
            this.root = null;
        }
    
        public int compareTo(Object n) {
            Node node = (Node)n;
            return this.root.compareTo(node);
        }
    
        public void insert(Comparable key) {
            Node newNode = new Node(key);
            if (this.root == null) {
                this.root = newNode;
            } else {
                BinarySearchTree.insertNode(this.root, newNode);
            }
        }
    
        private static void insertNode(Node node, Node newNode) {
            if (newNode.compareTo(node) < 0) {
                if (node.getLeft() == null) {
                    node.setLeft(newNode);
                } else {
                    BinarySearchTree.insertNode(node.getLeft(), newNode);
                }
            } else {
                if (node.getRight() == null) {
                    node.setRight(newNode);
                } else {
                    BinarySearchTree.insertNode(node.getRight(), newNode);
                }
            }
        }
    
        /**
         * 按层级遍历
         * @param fn Handler
         */
        public void levelTraverse(Handler fn) {
            Queue<Node> q = new LinkedList<>();
            q.add(this.root);
            while (!q.isEmpty()) {
                Node front = q.remove();
                fn.handle(front.getValue());
                if (front.getLeft() != null) {
                    q.add(front.getLeft());
                }
                if (front.getRight() != null) {
                    q.add(front.getRight());
                }
            }
        }
    
        public void preOrderTraverse(Handler fn) {
            BinarySearchTree.preOrderReCur(this.root, fn);
            System.out.println();
            BinarySearchTree.preOrderNotRecur(this.root, fn);
            System.out.println();
        }
    
        private static void preOrderReCur(Node node, Handler fn) {
            if (node != null) {
                fn.handle(node.getValue());
                BinarySearchTree.preOrderReCur(node.getLeft(), fn);
                BinarySearchTree.preOrderReCur(node.getRight(), fn);
            }
        }
    
        private static void preOrderNotRecur(Node head, Handler fn) {
            if (head != null) {
                Stack<Node> stack = new Stack<Node>();
                stack.add(head);
                while (!stack.isEmpty()) {
                    head = stack.pop();
                    fn.handle(head.getValue());
                    if (head.getRight() != null) {
                        stack.push(head.getRight());
                    }
                    if (head.getLeft() != null) {
                        stack.push(head.getLeft());
                    }
                }
            }
        }
    
        public void inOrderTraverse(Handler fn) {
            // BinarySearchTree.inOrderRecur(this.root, fn);
            BinarySearchTree.inOrderNotRecur(this.root, fn);
            System.out.println();
        }
    
        /**
         * 中序遍历
         * @param node Node
         * @param fn Handler
         */
        private static void inOrderRecur(Node node, Handler fn) {
            if (node != null) {
                BinarySearchTree.inOrderRecur(node.getLeft(), fn);
                fn.handle(node.getValue());
                BinarySearchTree.inOrderRecur(node.getRight(), fn);
            }
        }
    
        private static void inOrderNotRecur(Node head, Handler fn) {
            if (head != null) {
                Stack<Node> stack = new Stack<Node>();
                while (!stack.isEmpty() || head != null) {
                    if (head != null) {
                        stack.push(head);
                        head = head.getLeft();
                    } else {
                        head = stack.pop();
                        fn.handle(head.getValue());
                        head = head.getRight();
                    }
                }
            }
        }
    
        public void posOrderTraverse(Handler fn) {
            // BinarySearchTree.posOrderRecur(this.root, fn);
            BinarySearchTree.posOrderNotRecur(this.root, fn);
        }
    
        private static void posOrderRecur(Node node, Handler fn) {
            if (node != null) {
                BinarySearchTree.posOrderRecur(node.getLeft(), fn);
                BinarySearchTree.posOrderRecur(node.getRight(), fn);
                fn.handle(node.getValue());
            }
        }
    
        private static void posOrderNotRecur(Node head, Handler fn) {
            if (head != null) {
                Stack<Node> s1 = new Stack<Node>();
                Stack<Node> s2 = new Stack<Node>();
                s1.push(head);
                while (!s1.isEmpty()) {
                    head = s1.pop();
                    s2.push(head);
                    if (head.getLeft() != null) {
                        s1.push(head.getLeft());
                    }
                    if (head.getRight() != null) {
                        s1.push(head.getRight());
                    }
                }
                while(!s2.isEmpty()) {
                    fn.handle(s2.pop().getValue());
                }
            }
        }
    }

    Handler.java? 遍历节点 操作函数接口

    package com.merrytech;
    
    public class Handler {
        public void handle(Object o) {
            System.out.print(o + " ");
        }
    }
    

    HelloWorld.java 主类

    package com.merrytech;
    
    public class Main {
    
        public static void main(String[] args) {
            String s = "532148769";
            BinarySearchTree tree = new BinarySearchTree();
            for (int i = 0; i < s.length(); i++) {
                tree.insert(s.charAt(i));
            }
            Handler h = new Handler();
            tree.inOrderTraverse(h);
            tree.levelTraverse(h); // 538247916
            // tree.preOrderTraverse(h);
            // tree.posOrderTraverse(h);
        }
    }
    

    ?

    PHP版本代码

    ====== 下面是环境配置 ======

    配置环境:

    E:\Java\jdk1.8.0_171\bin\java.exe "-javaagent:E:\Program Files\JetBrains\IntelliJ IDEA 2020.2.1\lib\idea_rt.jar=58732:E:\Program Files\JetBrains\IntelliJ IDEA 2020.2.1\bin" -Dfile.encoding=UTF-8 -classpath E:\Java\jdk1.8.0_171\jre\lib\charsets.jar;E:\Java\jdk1.8.0_171\jre\lib\deploy.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;E:\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;E:\Java\jdk1.8.0_171\jre\lib\javaws.jar;E:\Java\jdk1.8.0_171\jre\lib\jce.jar;E:\Java\jdk1.8.0_171\jre\lib\jfr.jar;E:\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;E:\Java\jdk1.8.0_171\jre\lib\jsse.jar;E:\Java\jdk1.8.0_171\jre\lib\management-agent.jar;E:\Java\jdk1.8.0_171\jre\lib\plugin.jar;E:\Java\jdk1.8.0_171\jre\lib\resources.jar;E:\Java\jdk1.8.0_171\jre\lib\rt.jar;D:\code\IdeaProjects\untitled\out\production\simple;C:\Users\mzh\.m2\repository\org\jetbrains\annotations\19.0.0\annotations-19.0.0.jar HelloWorld
    Hello world
    1 2 3 4 5 6 7 8 9?

    Process finished with exit code 0

    如果Intellij Idea打不开

    关注微信公众号 “PHP大神”

    回复“激活码”

    https://115.com/s/sw31f8o3hgz?password=df31
    jetbrains-agent-202002.zip
    访问码:df31

    最新更新于:2021-05-03
    下载地址:https://pan.baidu.com/s/1ux6PPxZOY37vLKvxAW7zyQ
    提取码:jpwl

    cs