java实现排序二叉树

  • Post author:
  • Post category:java

java实现一个排序树:

(1)每个节点:用一个类表示(父节点,左子节点,右子节点,自身,父节点对象,左右节点对象存储其地址)

(2)整体结构:用一个集合<Integer>表示

(3)初始化:空(约束条件:第一个添加的元素必须是根节点,无父节点,左右节点分别置为空,自身赋值)

(4)插入方法:使用查询指针进行移动,首先设置为根节点,如果大于该节点则将指针移动到根节点的右子树,否则创建右子树并赋值,左子树同理

Tree节点:

package TreeArrayList;

import lombok.Data;

import java.util.Objects;


public class Tree {
    private Integer self;
    private Integer father;
    private Integer leftSon;
    private Integer rightSon;
    private Tree fatherTree;//存储父节点地址
    private Tree leftSonTree;//存储左节点地址
    private Tree rightSonTree;//存储右节点地址

    //根节点:只有self
    //正常节点:有父节点,子节点
    public Tree(Integer self) {
        this.self = self;//创建根节点
//        this.father = null;
//        this.leftSon = null;
//        this.rightSon = null;
    }

    public Tree() {
    }

    public Tree(Integer self, Integer father, Tree fatherTree) {
        this.self = self;
        this.father = father;
        this.fatherTree = fatherTree;//创建一个新的有父节点的子节点
    }



    public Integer getSelf() {
        return self;
    }

    public void setSelf(Integer self) {
        this.self = self;
    }

    public Integer getFather() {
        return father;
    }

    public void setFather(Integer father) {
        this.father = father;
    }

    public Integer getLeftSon() {
        return leftSon;
    }

    public void setLeftSon(Integer leftSon) {
        this.leftSon = leftSon;
    }

    public Integer getRightSon() {
        return rightSon;
    }

    public void setRightSon(Integer rightSon) {
        this.rightSon = rightSon;
    }

    public Tree getFatherTree() {
        return fatherTree;
    }

    public void setFatherTree(Tree fatherTree) {
        this.fatherTree = fatherTree;
    }

    public Tree getLeftSonTree() {
        return leftSonTree;
    }

    public void setLeftSonTree(Tree leftSonTree) {
        this.leftSonTree = leftSonTree;
    }

    public Tree getRightSonTree() {
        return rightSonTree;
    }

    public void setRightSonTree(Tree rightSonTree) {
        this.rightSonTree = rightSonTree;
    }


}

TreeStore:

package TreeArrayList;

import lombok.Data;


import java.util.ArrayList;
import java.util.Iterator;

@Data
public class TreeStore {
    public static ArrayList<Tree> sortTree;//排序二叉树的存储集合

    public static Tree addTreePointer;//将移动指针设置为全局变量

    public TreeStore() {
        ArrayList<Tree> sortTree = new ArrayList<>();
        TreeStore.sortTree = sortTree;//初始化构造函数给一个空的存储集合
    }

    public void add(Integer add){
        if(null != sortTree){
            if(0 == sortTree.size()){
                Tree BaseTree = new Tree(add);//置为根节点,并将根节点加入static
                sortTree.add(BaseTree);
            }else {
                //引入对象指向根节点,先查找根节点
                Tree BaseTree = new Tree();
                Iterator<Tree> iterator = sortTree.iterator();
                while (iterator.hasNext()){
                    Tree next = iterator.next();
                    if(null == next.getFatherTree()){
                        BaseTree = next;
                    }
                }//找到根节点
//                sortTree.add(BaseTree);
                //设置一个插入指针,先指向根节点
//                Tree addTreePointer = new Tree();

                addTreePointer = BaseTree;

                while (true){
                    Boolean aBoolean = serachPointer(addTreePointer, add);
                    if(aBoolean){
                        break;
                    }
                }
            }
        }else {
            System.out.println("未创建新的二叉树!");
        }
    }

    public static Boolean serachPointer(Tree addTreePointer,Integer add){
        //根据插入指针来操作,如果要插入的数据小于插入指针的值
        if(add<addTreePointer.getSelf()){
            if(null == addTreePointer.getLeftSonTree()){
                //如果左边没有那么创建左子树,并将指针节点的左子树设置为该左节点,终结条件
                Tree leftTree = new Tree(add, addTreePointer.getFather(), addTreePointer.getFatherTree());
                addTreePointer.setLeftSonTree(leftTree);
                addTreePointer.setLeftSon(leftTree.getSelf());
                leftTree.setFather(addTreePointer.getSelf());
                leftTree.setFatherTree(addTreePointer);
                sortTree.add(leftTree);//插入新的元素

                return true;
            }else {
                //否则查询指针变为左子树
                TreeStore.addTreePointer = addTreePointer.getLeftSonTree();
                return false;
            }
        }else if(add > addTreePointer.getSelf()){
            if(null == addTreePointer.getRightSonTree()){
                //如果左边没有那么创建右子树,并将指针节点的左子树设置为该左节点
                Tree RightTree = new Tree(add, addTreePointer.getFather(), addTreePointer.getFatherTree());
                addTreePointer.setRightSonTree(RightTree);
                addTreePointer.setRightSon(RightTree.getSelf());
                RightTree.setFatherTree(addTreePointer);
                RightTree.setFather(addTreePointer.getSelf());
                sortTree.add(RightTree);
//                TreeStore.addTreePointer = addTreePointer.getRightSonTree();
                return true;
            }else {
                //否则查询指针变为右子树
                TreeStore.addTreePointer = addTreePointer.getRightSonTree();
                return false;
            }
        }else {
            System.out.println("插入的数据已经存在,不能插入!");
            return false;
        }

    }

    public static void ArrayListUpdate(Tree tree){
        if(null!=sortTree){
            if(0==sortTree.size()){

            }else {
                Tree BaseTree = new Tree();
                Iterator<Tree> iterator = sortTree.iterator();
                while (iterator.hasNext()){
                    Tree next = iterator.next();
                    if(null == next.getFatherTree()){
                        BaseTree = next;
                    }
                }
                //引入左移动指针和右移动指针
            }
        }
    }
}

测试方法;

TestMain:

package TreeArrayList;

import java.util.Iterator;

public class TestMain {
    public static void main(String[] args) {
        TreeStore treeStore = new TreeStore();
        treeStore.add(7);
        treeStore.add(4);
        treeStore.add(3);
        treeStore.add(6);
        treeStore.add(5);
        //如果用toString方法会出现错误,因为子节点的属性中有父节点对象,父节点对象的属性中也有子节点
        Iterator<Tree> iterator = TreeStore.sortTree.iterator();
        while (iterator.hasNext()){
            Tree next = iterator.next();
            System.out.println("该节点是:"+next.getSelf()+"  "+"父节点是:"+next.getFather()+"左右子节点分别是:"+next.getLeftSon()+" "+next.getRightSon());
        }

    }
}

 


版权声明:本文为weixin_42439479原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。