最简单的二叉树
定义二叉树结点
//二叉树结点
class TreeNode {
int value;//承载数据
TreeNode left;//小的去左子
TreeNode right;//大的去右子
//构造器
public TreeNode(int value) {
this.value = value;
}
}
二叉树
//二叉树
class Tree {
private TreeNode root;//根节点
private int size; //计数器
//插入逻辑
public void insert(TreeNode childRoot, TreeNode newNode) {
if (childRoot == null) {//子节点为空弹栈
return;
}
if (newNode.value < childRoot.value) {//小的去左边
if (childRoot.left == null) {//左子空直接刷
childRoot.left = newNode;
} else {//左子非空递归
insert(childRoot.left, newNode);
}
} else {//大的去右边
if (childRoot.right == null) {//右子空直接刷
childRoot.right = newNode;
} else {//右子非空递归
insert(childRoot.right, newNode);
}
}
}
插入
//插入
public void add(int val) {
TreeNode newNode = new TreeNode(val);
if (root == null) {
root = newNode;//树空直接刷
} else {//非空递归
insert(root, newNode);
}
++size;//计数器自增
}
统计结点个数
思路是每次插入结点之后,计数器size自增,所以获取总个数只需要返回size即可
public int size() {
return size;
}
遍历
//遍历逻辑
public void view(TreeNode childRoot) {
if (childRoot == null) {//树空弹栈
return;
}
if (childRoot.left != null) {//左子非空就递归
view(childRoot.left);
}
System.out.println(childRoot.value);//打印每个结点的值
if (childRoot.right != null) {//右子非空也递归
view(childRoot.right);
}
}
//遍历(递归)
public void travel() {
view(root);
}
测试
public class TreeTest {
public static void main(String[] args) {
Tree tree = new Tree();
tree.add(666);
tree.add(888);
tree.add(123);
tree.add(456);
tree.add(7);
tree.add(3);
tree.add(9);
tree.add(20);
tree.travel();
System.out.println("tree.size() = " + tree.size());
}
}
结果: