二叉树
二叉树是数据结构中非常重要的概念,今天我们尝试构建二叉树,我们使用了递归和非递归两种方式实现二叉树。希望对大家有所帮助。
二叉树概念
二叉树, 是最常用的树的形态,每个节点最多能够有两个子节点。
二叉树的集中形态
二叉树实现
数组中存储二叉树的数据,对应关系如图。
构建二叉树模型
已知数据进行构建
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);
}
随机数据构建二叉树模型
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());
tips: 代码中用到的TreePrint对象是封装的一个二叉树打印类。需要了解的可以参考我的另外一个博客二分搜索树
https://blog.csdn.net/qq_36115196/article/details/136766314?spm=1001.2014.3001.5501