二叉树创建

创建一棵二叉树,并进行先序,层次遍历

/**
 * @Author: DiTian
 * @Description: 树的创建
 * @Date: Created in 16:59 2021/7/28
 */
public class BTNode {
    //定义一个二叉树的结点
    private int data;
    private BTNode lchild;
    private BTNode rchild;
    //构造函数
    public BTNode(){
    }
    //新的构造函数,其实也可以简写
    public BTNode(int data ,BTNode lchild ,BTNode rchild){
        this.data=data;
        this.lchild=lchild;
        this.rchild=rchild;
    }
    //以下就是data lchild rchild的set,get函数
    public void setdata(int data){
        this.data=data;
    }
    public int  getdata(){
        return data;
    }
    public void setlchild(BTNode lchild ){
        this.lchild=lchild;
    }
    public BTNode getlchild(){
        return this.lchild;
    }
    public void setrchild(BTNode rchild ){
        this.rchild=rchild;
    }
    public BTNode getrchild(){
        return this.rchild;
    }

    //递归先序创建普通二叉树
    //以输入的值是否为0来确定其是不是有孩子结点。
    public static BTNode preCreat(BTNode btnode){
        Scanner in =new Scanner(System.in);
        System.out.println("输入结点的值");
        int value=in.nextInt();
        if(value!=0){
            btnode=new BTNode();
            btnode.setdata(value);
            //以下两行是核心代码
            btnode.setlchild(preCreat(btnode.getlchild()));
            btnode.setrchild(preCreat(btnode.getrchild()));
        }
        else
            //这个是一定要有的,确定最终的结束结点
            btnode=null;
        return btnode;
    }

    //先序遍历以及访问处理
    public static void visit(BTNode btnode){
        if(btnode!=null)
            System.out.print(btnode.getdata() + " ,");
    }
    public static  void preorder(BTNode btnode) {
        if(btnode!=null){
            visit(btnode);
            preorder(btnode.getlchild());
            preorder(btnode.getrchild());
        }
    }
    //树的层次遍历
    public static List<List<Integer>> levelOrder(BTNode root) {
        List<List<Integer>> lists = new ArrayList<>();
        // 判空处理
        if (root == null) {
            return lists;
        }
        // 这里存放树的节点
        List<BTNode> nodes = new ArrayList<>();
        // 先把root节点加入节点集合
        nodes.add(root);
        // 如果节点集合有节点需要遍历
        while (!nodes.isEmpty()) {
            // 设置遍历集合大小
            int size = nodes.size();
            // 存放数据
            List<Integer> list = new ArrayList<>();
            for (int i = 0; i < size; i++) {
                // 取出第一集合元素,按照加入集合顺序打印
                BTNode remove = nodes.remove(0);
                // 把节点(类似于根节点)信息加入信息集合
                list.add(remove.data);
                if (remove.lchild != null) {
                    // 如果有左孩子先加左孩子
                    nodes.add(remove.lchild);
                }
                if (remove.rchild != null) {
                    // 如果有右孩子加入右孩子
                    nodes.add(remove.rchild);
                }
            }
            // 本次数据加入总的数据集合中
            lists.add(list);
        }
        return lists;
    }


    //测试
    public static void main(String[] args){
        BTNode tree=new BTNode();
        tree=preCreat(tree);
        preorder(tree);
        System.out.println(levelOrder(tree));
    }
}

上一篇:数据结构--二叉树


下一篇:二叉树的建立及其基本操作实验报告