zoukankan      html  css  js  c++  java
  • BinaryTreeTraversal(二叉树遍历)

    二叉树遍历

    遍历命名

    根据访问结点操作发生位置命名:
    ① NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
    ——访问根结点的操作发生在遍历其左右子树之前。
    ② LNR:中序遍历(Inorder Traversal)
    ——访问根结点的操作发生在遍历其左右子树之中(间)。
    ③ LRN:后序遍历(Postorder Traversal)
    ——访问根结点的操作发生在遍历其左右子树之后。
    注意:
    由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

     概念抄至百度百科:https://baike.baidu.com/item/二叉树遍历/9796049?fr=aladdin

    Java代码实现:

    public class BinaryTreeTraversal {
    
        /**
         *                            1
         *                 2                      3
         *            4       5              6          7
         *         8    9  10   11       12    13   14    15
         *
         *  前序 => 1|2|4|8|9|5|10|11|3|6|12|13|7|14|15|
         *  中序 => 8|4|9|2|10|5|11|1|12|6|13|3|14|7|15|
         *  后序 => 8|9|4|10|11|5|2|12|13|6|14|15|7|3|1|
         */
        public static void main(String[] args) {
            Node n1 = new Node(1);
            BinaryTree binaryTree = new BinaryTree(n1);
    
            Node n2 = new Node(2);Node n3 = new Node(3);
            Node n4 = new Node(4);Node n5 = new Node(5);
            Node n6 = new Node(6);Node n7 = new Node(7);
            Node n8 = new Node(8);Node n9 = new Node(9);
            Node n10 = new Node(10);Node n11 = new Node(11);
            Node n12 = new Node(12);Node n13 = new Node(13);
            Node n14 = new Node(14);Node n15 = new Node(15);
    
            n1.setLeftSubNode(n2);n1.setRightSubNode(n3);
            n2.setLeftSubNode(n4);n2.setRightSubNode(n5);
            n3.setLeftSubNode(n6);n3.setRightSubNode(n7);
            n4.setLeftSubNode(n8);n4.setRightSubNode(n9);
            n5.setLeftSubNode(n10);n5.setRightSubNode(n11);
            n6.setLeftSubNode(n12);n6.setRightSubNode(n13);
            n7.setLeftSubNode(n14);n7.setRightSubNode(n15);
    
            binaryTree.preOrderTraversal();
            System.out.println("");
            binaryTree.inOrderTraversal();
            System.out.println("");
            binaryTree.postOrderTraversal();
        }
    
    
        public static class BinaryTree {
    
            private Node root;
    
            public void preOrderTraversal() {
                this.root.preOrderTraversal();
            }
    
            public void inOrderTraversal() {
                this.root.inOrderTraversal();
    
            }
    
            public void postOrderTraversal() {
                this.root.postOrderTraversal();
            }
    
    
            public BinaryTree(Node root) {
                this.root = root;
            }
    
            public Node getRoot() {
                return root;
            }
    
            public void setRoot(Node root) {
                this.root = root;
            }
        }
    
        public static class Node {
    
            private int id;
    
            private Node leftSubNode;
    
            private Node rightSubNode;
    
            public Node(int id) {
                this.id = id;
            }
    
            public int getId() {
                return id;
            }
    
            public void setId(int id) {
                this.id = id;
            }
    
            public Node getLeftSubNode() {
                return leftSubNode;
            }
    
            public void setLeftSubNode(Node leftSubNode) {
                this.leftSubNode = leftSubNode;
            }
    
            public Node getRightSubNode() {
                return rightSubNode;
            }
    
            public void setRightSubNode(Node rightSubNode) {
                this.rightSubNode = rightSubNode;
            }
    
            /**
             * NLR:前序遍历(Preorder Traversal 亦称(先序遍历))
             * 访问根结点的操作发生在遍历其左右子树之前。
             */
            public void preOrderTraversal() {
                //N
                System.out.print(this);
    
                //L
                if (this.leftSubNode != null) {
                    this.leftSubNode.preOrderTraversal();
                }
    
                //R
                if (this.rightSubNode != null) {
                    this.rightSubNode.preOrderTraversal();
                }
            }
    
            /**
             * LNR:中序遍历(Inorder Traversal)
             * 访问根结点的操作发生在遍历其左右子树之中(间)。
             */
            public void inOrderTraversal() {
                //L
                if (this.leftSubNode != null) {
                    this.leftSubNode.inOrderTraversal();
                }
    
                //N
                System.out.print(this);
    
                //R
                if (this.rightSubNode != null) {
                    this.rightSubNode.inOrderTraversal();
                }
            }
    
            /**
             * LRN:后序遍历(Postorder Traversal)
             * 访问根结点的操作发生在遍历其左右子树之后。
             */
            public void postOrderTraversal() {
                //L
                if (this.leftSubNode != null) {
                    this.leftSubNode.postOrderTraversal();
                }
    
                //R
                if (this.rightSubNode != null) {
                    this.rightSubNode.postOrderTraversal();
                }
    
                //N
                System.out.print(this);
            }
    
            @Override public String toString() {
                return this.getId() + "|";
            }
        }
    
    }
  • 相关阅读:
    android利用ContentResolver访问者获取手机联系人信息
    Retrofit 实现获取往里圆角图片,且传值到另一个页面
    Android简单计时器
    几个比较常用的jar包
    Android双击Home键返回桌面
    两层fragment嵌套时出现空白,(收藏别人的)
    自动轮播本地图片触摸暂停轮播
    Fragment中TabLayout加FragmentViewPager
    Android 删除已知路径的文件或文件夹
    树莓派开机后获取正确时间
  • 原文地址:https://www.cnblogs.com/sleepingDogs/p/11143957.html
Copyright © 2011-2022 走看看