• 数据结构(5):Java实现二叉树


        

      二叉树图:

        

    package com.test.Sort;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    
    public class Binary_Tree {
        //java实现二叉树实现
        public static void main(String[] args) {
            Tree t =new Tree();
            t.add("A");
            t.add("B");
            t.add("C");
            Node root = t.getRoot();
            //先序遍历
            System.out.println("先序遍历:");
            t.Preorder(root);
            System.out.println("------------------------");
            //中序遍历
            System.out.println("中序遍历:");
            t.inOrder(root);
            System.out.println("------------------------");
            //后序遍历
            System.out.println("后序遍历:");
            t.postOrder(root);
        }
    
    }
    
    //节点类
    class Node{
        //头节点
        private String node;
        //左节点
        private Node iLnode;
        //右节点
        private Node iRnode;
    
        public Node(String node){
            this.node = node;
        }
    
        public String getNode() {
            return node;
        }
    
        public void setNode(String node) {
            this.node = node;
        }
    
        public Node getiLnode() {
            return iLnode;
        }
    
        public void setiLnode(Node iLnode) {
            this.iLnode = iLnode;
        }
    
        public Node getiRnode() {
            return iRnode;
        }
    
        public void setiRnode(Node iRnode) {
            this.iRnode = iRnode;
        }
    }
    
    //创建二叉树
    class Tree{
        private Node root;
        public Tree(){};
    
        public Node getRoot() {
            return root;
        }
    
        public void setRoot(Node root) {
            this.root = root;
        }
    
        /**
         *
         * 递归实现先序遍历
         * 先序遍历 在先序遍历中,我们先访问根节点,然后递归使用先序遍历访问左子树,再递归使用先序遍历访问右子树
         * 根节点->左子树->右子树
         *     他的顺序是:
         *         A
         *      B     C
         *
         * 先序遍历是:A为根节点,左子数节点B,右子数节点C
         * **/
        public void Preorder(Node node){
            //如果先序遍历的根节点是空的,直接退出
            if(node==null)
                return;
            System.out.println(node.getNode());
            Preorder(node.getiLnode());
            Preorder(node.getiRnode());
        }
    
    
        /**
         * 中序遍历
         *
         * 中序遍历:左子数节点B,A为根节点,右子数节点C
         *
         * **/
        public void inOrder(Node node){
            //如果先序遍历的根节点是空的,直接退出
            if(node==null)
                return;
            inOrder(node.getiLnode());
            System.out.println(node.getNode());
            inOrder(node.getiRnode());
        }
    
        /**
         * 后序遍历
         * 后序遍历:左子数节点B,右子数节点C,A为根节点,
         *
         * **/
        public void postOrder(Node node){
            //如果先序遍历的根节点是空的,直接退出
            if(node==null)
                return;
            postOrder(node.getiLnode());
            postOrder(node.getiRnode());
            System.out.println(node.getNode());
        }
    
    
        public void add(String elem){
            Node node = new Node(elem);
            //如果二叉树节点是空的
            if(root==null){
                //把传递进去的node传递给root,此时root有数据
                root = node;
                return;
            }else{
                //定义个list列表
                LinkedList linkedList =new LinkedList();
                //列表中添加root节点数据
                linkedList.add(root);
                //如果列表不为空
                while(!linkedList.isEmpty()){
                    //移出第一个元素
                    Node element  = (Node) linkedList.pop();
                    if(element.getiLnode()==null){
                        //左节点为空,设置左节点
                        element.setiLnode(node);
                        return;
                    }else if(element.getiRnode()==null){
                        //右节点为空,设置右节点
                        element.setiRnode(node);
                        return;
                    }else{
                         //如果左右子树都不为空,继续加入数据
                        linkedList.add(element.getiLnode());
                        linkedList.add(element.getiRnode());
                    }
                }
            }
        }
    }

       输出:

        

      一个抽象概念:  

        

    同一个对象调用方法
    以二叉树为例:
    只有add方法,当add(a)时, 那么此时头节点就是a,当add(b)的时候,头节点不会是b,b只能左节点和右节点。
    
    如果是不同的对象调用add方法,那么头节点是a也可以是b
    原理:同一个对象之间数据互相影响
    不同对象的之间互不干涉
  • 相关阅读:
    solidity 学习笔记(5)接口
    solidity 学习笔记(4)library库
    以太坊开发教程(二) 利用truffle发布宠物商店 DAPP 到 以太坊测试环境Ropsten
    以太坊开发教程(一) truffle框架简介/安装/使用
    软分叉/硬分叉/重放攻击/重放保护
    linux安装node.js
    jq获取元素偏移量offset()
    js:把字符串转为变量使用; js下将字符串当函数去执行的方法
    JS中json数组多字段排序方法(解决兼容性问题)(转)
    javascript之取余数、去商、天花板取整、地板取整
  • 原文地址:https://www.cnblogs.com/piaomiaohongchen/p/14549498.html
Copyright © 2020-2023  润新知