关于手动构建二叉树和它的底层逻辑

手动构建二叉树要满足的基本功能:创建二叉树节点;存数据;取数据;

  1. 创建节点:
/**
 * 二叉树的节点
 */
public class TreeNode {
    
    
    private Integer data;
    private TreeNode left;
    private TreeNode right;

    public TreeNode(Integer data) {
    
    
        this.data = data;
    }

    public Integer getData() {
    
    
        return data;
    }

    public void setData(Integer data) {
    
    
        this.data = data;
    }

    public TreeNode getLeft() {
    
    
        return left;
    }

    public void setLeft(TreeNode left) {
    
    
        this.left = left;
    }

    public TreeNode getRight() {
    
    
        return right;
    }

    public void setRight(TreeNode right) {
    
    
        this.right = right;
    }
}
  1. 利用节点添加有带有存储顺序的二叉树:
 
public class BinarySortTree {
    
    
    private TreeNode root;
    
     /**
     * 添加数据
     *该二叉树的数据结构:左节点<根<=右节点
     */
    public  boolean add(Integer data){
    
    
        if(root == null){
    
    
            this.root = new TreeNode(data);
        }else{
    
    
            TreeNode current = root;
            TreeNode presentNode = null;
            while(current!=null){
    
    
                presentNode = current;
                if(data<current.getData()){
    
    
                    current = current.getLeft();
                    if(current != null){
    
    
                        presentNode.setLeft(new TreeNode(data));
                        return true;
                    }
                }else{
    
    
                    current = current.getRight();
                    if(current != null){
    
    
                        presentNode.setRight(new TreeNode(data));
                        return true;
                    }
                }
            }
        }
        return false;
    }

    public TreeNode getRoot() {
    
    
        return root;
    }

    public void setRoot(TreeNode root) {
    
    
        this.root = root;
    }

	 /**
     * 查找指定数据
     */
    public TreeNode get(Integer key){
    
    
        TreeNode temp = root;
        while(temp!=null){
    
    
            if(key<temp.getData()){
    
    
                temp = temp.getLeft();
            }else if(key>temp.getData()){
    
    
                temp = temp.getRight();
            }else
                return temp;
        }
        return null;
    }
}
  1. 功能的实现
public class MainTest {
    
    
    public static void main(String[] args) {
    
    
/**
        //存入数据
        BinarySortTree tree = new BinarySortTree();
        tree.add(3);
        tree.add(1);
        tree.add(7);
        tree.add(2);
        tree.add(5);
        tree.add(6);
        tree.add(4);
        //打印数据
        mid_print(tree.getRoot());
        //左节点<根<=右节点的二叉树配合左根右的输出,输出的数据是排好顺序的;
        
        //查找指定数据
        TreeNode temp = tree.get(7);
        if(temp!=null)
            System.out.println("找到了");
        else
            System.out.println("未找到");
*/
        //创建七个节点
      	TreeNode root = new TreeNode(1);
        TreeNode node1 = new TreeNode(2);
        TreeNode node2 = new TreeNode(3);
        TreeNode node3 = new TreeNode(4);
        TreeNode node4 = new TreeNode(5);
        TreeNode node5 = new TreeNode(6);
        TreeNode node6 = new TreeNode(7);
        //将节点串成数
        root.setLeft(node1);
        root.setRight(node2);
        node1.setLeft(node3);
        node1.setRight(node4);
        node2.setRight(node6);
        node2.setLeft(node5);
        //printByLayer(root);
        //pre_print(root);
        //mid_print(root);
        //last_print(root);
    }

    /**
     * 按广度遍历:按层打印
     */
    public static void printByLayer(TreeNode root){
    
    
        if(root == null){
    
    
            return;
        }
        //创建一个队列,先进先出
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty()){
    
    //判断queue是否为null
            TreeNode temp = queue.poll();
            System.out.println(temp.getData());
            if(temp.getLeft()!=null)
                queue.add(temp.getLeft());
            if(temp.getRight()!=null)
                queue.add(temp.getRight());
        }
    }

    /**
     * 按深度遍历:前/先序遍历:根左右
     */
    public static void pre_print(TreeNode root) {
    
    
        if (root == null)
            return;

        System.out.println(root.getData());
        if(root.getLeft()!=null){
    
    
            pre_print(root.getLeft());
        }
        if(root.getRight()!=null){
    
    
            pre_print(root.getRight());
        }
    }

    /**
     * 按深度遍历:中序遍历:左根右
     */
    public static void mid_print(TreeNode root){
    
    
        if(root == null)
            return;

        if(root.getLeft()!=null){
    
    
            mid_print(root.getLeft());
        }
        System.out.println(root.getData());
        if(root.getRight()!=null){
    
    
            mid_print(root.getRight());
        }
    }

    /**
     * 按深度遍历:后续遍历:左右根
     */
    public static void last_print(TreeNode root){
    
    
        if(root==null)
            return;

        if(root.getLeft()!=null){
    
    
            last_print(root.getLeft());
        }
        if (root.getRight()!=null){
    
    
            last_print(root.getRight());
        }
        System.out.println(root.getData());
    }
}

おすすめ

転載: blog.csdn.net/m0_58702068/article/details/120597670