二叉排序树 - 从实践到入门

二叉排序树定义

两个叉,有排序,的树。

  1. 每个结点最多只有两个子节点。
  2. 有序。左节点<根节点<右节点。
    在这里插入图片描述

手写二叉排序树

结点类

public class Node {
    public int id; // 结点值
    public Node leftNode; // 左结点
    public Node rightNode;// 右结点

    // 初始化节点的值
    public Node(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Node{" +
                "id=" + id +
                ", leftNode=" + leftNode +
                ", rightNode=" + rightNode +
                '}';
    }
}

试着输出下单个结点:

public static void main(String[] args) {
        Node node = new Node(2);
        System.out.println(node);
 }

输出如下:Node{id=2, leftNode=null, rightNode=null}

二叉排序树新增结点

给定一个数组[2,1,4,3,6],将数据元素插入至二叉排序树中:
在这里插入图片描述

  1. 初始化根结点
  2. 和中间结点比较,小于中间结点在左边,大于中间结点在右边
  3. 如果左右结点为空,则直接放置,否则,接着往下找到合适的位置放置为止。
public class BinarySortTree {
    public static void main(String[] args) {
    	// 1. 初始化二叉树
        int[] arr = {2, 1, 4, 3, 6};
        Node node = new Node(arr[0]); // 初始化根节点
        for (int i = 1; i < arr.length; i++) {
            insertNode(node, arr[i]);
        }
        System.out.println(node);
    }
	
    public static void insertNode(Node node, int num) {
        if (node == null) {
            return;
        }
        // 判断传入值和节点值大小关系,小于往左,大于往右
        if (num < node.id) {
            if (node.leftNode == null) {
                node.leftNode = new Node(num);
            } else {
                insertNode(node.leftNode, num);
            }
        }

        if (num > node.id) {
            if (node.rightNode == null) {
                node.rightNode = new Node(num);
            } else {
                insertNode(node.rightNode, num);
            }
        }
    }
 
}

输出结果如下:
Node{id=2, leftNode=Node{id=1, leftNode=null, rightNode=null}, rightNode=Node{id=4, leftNode=Node{id=3, leftNode=null, rightNode=null}, rightNode=Node{id=6, leftNode=null, rightNode=null}}}

二叉排序树遍历

前中后指中间结点位置

  1. 前序遍历:中左右(2,1,4,3,6)和插入顺序一致
  2. 中序遍历:左中右(1,2,3,4,6)
  3. 后序遍历:左右中(1,3,6,4,2)
    在这里插入图片描述
public class BinarySortTree {
    public static void main(String[] args) {
        // 1. 初始化二叉树
        int[] arr = {2, 1, 4, 3, 6};
        Node node = new Node(arr[0]); // 初始化根节点
        for (int i = 1; i < arr.length; i++) {
            insertNode(node, arr[i]);
        }
        System.out.println(node);
        
        System.out.println("==== 二叉排序树前序遍历 ====");
        preorder(node);
        
        System.out.println("==== 二叉排序树中序遍历 ====");
        middleOrder(node);

        System.out.println("==== 二叉排序树后序遍历 ====");
        postOrder(node);

    }

    public static void insertNode(Node node, int num) {
        if (node == null) {
            return;
        }
        // 判断传入值和节点值大小关系,小于往左,大于往右
        if (num < node.id) {
            if (node.leftNode == null) {
                node.leftNode = new Node(num);
            } else {
                insertNode(node.leftNode, num);
            }
        }

        if (num > node.id) {
            if (node.rightNode == null) {
                node.rightNode = new Node(num);
            } else {
                insertNode(node.rightNode, num);
            }
        }
    }

    // 中 左 右
    public static void preorder(Node node) {
        if (node == null) {
            return;
        }
        System.out.println(node.id); // 输出当前结点
        if (node.leftNode != null) {
            preorder(node.leftNode);
        }
        if (node.rightNode != null) {
            preorder(node.rightNode);
        }
    }

    // 左 中 右
    public static void middleOrder(Node node) {
        if (node == null) {
            return;
        }
        if (node.leftNode != null) {
            middleOrder(node.leftNode);
        }
        System.out.println(node.id);
        if (node.rightNode != null) {
            middleOrder(node.rightNode);
        }
    }

    // 左 右 中
    public static void postOrder(Node node) {
        if (node == null) {
            return;
        }
        if (node.leftNode != null) {
            postOrder(node.leftNode);
        }
        if (node.rightNode != null) {
            postOrder(node.rightNode);
        }
        System.out.println(node.id);
    }
}

输出如下:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值