数据结构与算法-树-二叉树(一)

二叉树

二叉树是数据结构中非常重要的概念,今天我们尝试构建二叉树,我们使用了递归和非递归两种方式实现二叉树。希望对大家有所帮助。

二叉树概念

二叉树, 是最常用的树的形态,每个节点最多能够有两个子节点

image-20240318142949194

二叉树的集中形态

image-20240318144832963

二叉树实现

数组中存储二叉树的数据,对应关系如图。

image-20240318092855310

构建二叉树模型

已知数据进行构建

public Node<E> buildTree(E[] arr, int index) {
    Node<E> newNode = null;

    if (index < arr.length) { //小于数组长度
        if (arr[index] == null) {  //递归终止条件
            return null;
        }
        newNode = new Node<>(arr[index]);  //创建新节点
        newNode.left = buildTree(arr, index * 2 + 1); //挂左子树
        newNode.right = buildTree(arr, index * 2 + 2); //挂右子树
    }
    return newNode;
}

测试

public static void main(String[] args) {
    Integer[] arr = {4,7,12,null,9,null,2};
    Node<Integer> root = new BinaryTree<Integer>().buildTree(arr, 0);
    new TreePrint<Integer>().print(root);
}

image-20240318102554613

随机数据构建二叉树模型

public class BinaryTree<E> {

    private Node<E> root;
    private final Queue<Node<E>> queue = new ArrayDeque<>();

    public BinaryTree() {
    }

    public BinaryTree(Node<E> root) {
        this.root = root;
        queue.add(this.root);
    }

    public Node<E> getRoot() {
        return root;
    }



    public void buildTreeRandom(E data) {


        Node<E> currNode = queue.peek();
        if (currNode == null) return;
        
        if (currNode.left == null) {
            currNode.left = new Node<>(data);
            queue.add(currNode.left);

        } else if (currNode.right == null) {
            currNode.right = new Node<>(data);
            queue.add(currNode.right);
            queue.poll();
        }
    }
}

测试

Node<Integer> root = new Node<>(66);
BinaryTree<Integer> tree = new BinaryTree<>(root);
tree.buildTreeRandom(11);
tree.buildTreeRandom(41);
tree.buildTreeRandom(15);
tree.buildTreeRandom(33);
tree.buildTreeRandom(22);

new TreePrint<Integer>().print(tree.getRoot());

image-20240318121446477

tips: 代码中用到的TreePrint对象是封装的一个二叉树打印类。需要了解的可以参考我的另外一个博客二分搜索树
https://blog.csdn.net/qq_36115196/article/details/136766314?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值