我们之前已经学习过单链表的构建,而二叉树的构建和单链表大同小异。
还是先写一个类来构建二叉树的节点。
public class TreeNode {
public Integer value;
public TreeNode leftChild;
public TreeNode rightChild;
public TreeNode(Integer value) {this.value=value;}
}
然后再定义一个测试类方便后续测试。
public class Test {
public static void main(String[] args) {
BinaryTree binaryTree = new BinaryTree(1);
BinaryTree binaryTree = new BinaryTree(2);
BinaryTree binaryTree = new BinaryTree(3);
}
现在的话我们只是构建了三个毫不相干的节点,为了让它们联系起来形成二叉树,我们还得创建一个管理类并写相应的方法来构建二叉树以及实现对二叉树的一些基本操作。
构建二叉树有两种方法。
方法一:
public class BinaryTree {
/**
* 定义当前整棵树的记录
*/
public TreeNode root;
public void insert(Integer value) {
//新建一个节点
TreeNode newNode = new TreeNode(value);
if (root == null) {
root = newNode;
return;
}
//创建节点进行遍历
TreeNode currentNode = root;
TreeNode parentNode;
while(true){
parentNode = currentNode;
if(newNode.value > currentNode.value) {
currentNode = currentNode.rightChild;
if(currentNode == null){
parentNode.rightChild = newNode;
return;
}
} else{
currentNode = currentNode.leftChild;
if(currentNode == null){
parentNode.leftChild = newNode;
return;
}
}
}
}
方法二(递归):
public TreeNode insert(Integer value, TreeNode node){
//新建一个节点
TreeNode newNode = new TreeNode(value);
if (root == null) {
root = node;
return root = newNode;
}
if(node.value < value){
if(node.rightChild == null){
node.rightChild = newNode;
return root;
}
return insert(value,node.rightChild);
} else {
return insert(value,node.leftChild);
}
}
二叉树的输出我们可以利用jdk当中的队列来实现。
// 队列 --> 一个数组 / 链表 --> 入队列和出队列的方法
// add() pop()
public void Order(){
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()){
TreeNode treeNode = queue.pop();
System.out.println(treeNode.value);
if (treeNode.leftChild != null){
queue.add(treeNode.leftChild);
}
if (treeNode.rightChild !=null){
queue.add(treeNode.rightChild);
}
}
}
主要用的是add方法(节点的添加)和pop方法(输出头结点)。