zoukankan      html  css  js  c++  java
  • ### 树形结构的优点

    **为什么要有树这种结构?**
    数组和链表分析:
    **数组**:在查找时因为有下标,所以查找的速度特别快还可以使用二分(插值)查找提高效率;
    但是在增加或删除数据时,需将数组扩容或者减小容量(新创建一个数组将原数组需要的数组拷贝进去),
    并将一些数据前移或者后移效率低下
    **链表**:对于添加和删除操作效率较高,但是查找效率低(从头开始);
    树结构可以改善这种情况。

    ### 二叉树

    二叉树:
    1.树有很多种,如果每个节点最多只有两个子节点就称为二叉树;
    2.二叉树的每个字节点分为左子节点和右子节点;
    3.如果二叉树的所有叶子节点都在最后一层,并且节点总数为2的n次方减一,(n为层数),则我们称为满二叉树;
    4.如果所有叶子节点都在最后一层或者倒数第二层,而且最后一层的节点左连续,倒数第二层的叶子节点右连续,我们称之为完全二叉树。

    二叉树的遍历

    前序遍历

    先输出父节点,在输出左节点,最后输出右节点。

    中序遍历

    先输出左节点,在输出父节点,最后输出右节点。

    后序遍历

    先输出左节点,在输出右节点,最后输出父节点。

    二叉树的遍历代码实现

    public class BinaryTreeDemo {
        public static void main(String[] args) {
            BinaryTree  btree =  new BinaryTree();
            Node root= new Node(1);
            Node nod2= new Node(2);
            Node nod3= new Node(3);
            Node nod4= new Node(4);
            root.left=nod2;
            root.right=nod3;
            nod2.left=nod4;
            btree.setRoot(root);
            //btree.preOrder();
            //btree.midOrder();
            btree.postOrder();
        }
    
    }
    
    class BinaryTree{
        private Node root;
    
        public void setRoot(Node root) {
            this.root = root;
        }
        //前序遍历
        public void preOrder(){
            if (this.root!=null){
                this.root.preOrder();
            }else{
                System.out.println("二叉树为空!");
            }
        }
        //前序遍历查找
        public Node preOrderSearch(int no){
            if (this.root!=null){
                return this.root.preOrderSearch(no);
            }else{
                return null;
            }
        }
        //中序遍历
        public void midOrder(){
            if (this.root!=null){
                this.root.midOrder();
            }else{
                System.out.println("二叉树为空!");
            }
        }
        //中序遍历查找
        public Node midOrderSearch(int no){
            if (this.root!=null){
                return this.root.midOrderSearch(no);
            }else{
                return null;
            }
        }
        //后序遍历
        public void postOrder(){
            if (this.root!=null){
                this.root.postOrder();
            }else{
                System.out.println("二叉树为空!");
            }
        }
        //后序遍历查找
        public Node postOrderSearch(int no){
            if (this.root!=null){
                return this.root.postOrderSearch(no);
            }else{
                return null;
            }
        }
    }
    
    class  Node{
        int no;
        Node left;
        Node  right;
        public Node(){
        }
        public Node(int no){
            this.no=no;
        }
        @Override
        public String toString() {
            return "Node{" +
                    "no=" + no +
                    '}';
        }
    
        //前序遍历
        public void preOrder(){
            System.out.println(this);
            if(this.left!=null){
                this.left.preOrder();
            }
            if(this.right!=null){
                this.right.preOrder();
            }
        }
        //遍历查找
        public Node preOrderSearch(int no){
            if(this.no==no){
                return this;
            }
            Node resNode =null;
            if(this.left!=null){
                resNode=this.left.preOrderSearch(no);
            }
            if (resNode!=null){
                return resNode;
            }
            if(this.right!=null){
                resNode=this.right.preOrderSearch(no);
            }
            return resNode;
        }
        //中序遍历
        public void midOrder(){
            if(this.left!=null){
                this.left.midOrder();
            }
            System.out.println(this);
            if(this.right!=null){
                this.right.midOrder();
            }
        }
        //遍历查找
        public Node midOrderSearch(int no){
            Node resNode =null;
            if(this.left!=null){
                resNode=this.left.midOrderSearch(no);
            }
            if (resNode!=null){
                return resNode;
            }
            if(this.no==no){
                return this;
            }
            if(this.right!=null){
                resNode=this.right.midOrderSearch(no);
            }
            return resNode;
        }
        //后序遍历
        public void postOrder(){
            if(this.left!=null){
                this.left.preOrder();
            }
            if(this.right!=null){
                this.right.preOrder();
            }
            System.out.println(this);
        }
        //遍历查找
        public Node postOrderSearch(int no){
            Node resNode =null;
            if(this.left!=null){
                resNode=this.left.postOrderSearch(no);
            }
            if (resNode!=null){
                return resNode;
            }
            if(this.right!=null){
                resNode=this.right.postOrderSearch(no);
            }
            if (resNode!=null){
                return resNode;
            }
            if(this.no==no){
                return this;
            }else{
                return null;
            }
        }
    }
  • 相关阅读:
    扩展AuthorizeAttribute
    扩展ValidationAttribute 1
    动态linq to list排序
    CSS属性书写顺序及命名规则
    增强网站可访问性的25种方法
    -webkit-filter是神马?
    docker安装
    docker的体系结构
    docker和虚拟化
    初识docker——docker基本概述
  • 原文地址:https://www.cnblogs.com/susexuexi011/p/14727080.html
Copyright © 2011-2022 走看看