1.先规划一个node树
//构建一个node,一个value 和左右两个节点
class node{
int value;
node left;
node right;
@Override
public String toString() {
return value+" ";
}
}
2.构建树,左子树比节点小,右子树比节点大。,添加的方式采用的递归,判断大小,再一层层找是否有空位,没位置再递归到下一层。直到有位置结束
//构建树
public void creatNodeTree(int num) {
//先做出判断是否首届点为空
if (root == null) {
//如果为空,则我加入的是第一个
root = new node();
root.value = num;
} else {
//不为空,我要进行判断,左边放比中间小的,右边放比中间大的。如果没有位置,则进行递归
addNodeTree(num, root);
}
}
//不为空,我要进行判断,左边放比中间小的,右边放比中间大的。如果没有位置,则进行递归
private void addNodeTree(int num, node nodeTree) {
//第一次先判断大小,再第二层判断是否为空
if (num < nodeTree.value){
//再判断是否为空
if (nodeTree.left == null){
//为空,则直接放进去
nodeTree.left = new node();
nodeTree.left.value = num;
}else {
//不为空则,递归到他的下一层
addNodeTree(num,nodeTree.left);
}
}else {
//如果比中间大则
//再判断是否为空
if (nodeTree.right == null){
//为空,则直接放进去
nodeTree.right = new node();
nodeTree.right.value = num;
}else {
//不为空则,递归到他的下一层
addNodeTree(num,nodeTree.right);
}
}
}
3.构建好树,遍历树,采用出对入队的方式,先进的先出,为了方便显示是一个树的结构,一层层入队再出队。出队后再获取它的左右子树地址,再次入队,进入下一层遍历,再出队,直到没有数再入队,队列里是空的,就结束了。
//遍历整个树,采用出对入队一层层遍历
public void findNodeTree(){
//先检查是否为空
if (root == null){
System.out.println("二叉树为空");
return;
}
//获取一个队列
Queue<node> queue = new LinkedList<>();
//加入头节点
queue.add(root);
//做一个循环,只要没有新的树在入队,入队为空,则停止遍历
while (!queue.isEmpty()){
int size = queue.size();
for (int i = 0; i < size; i++) {
//出队
node nodeQueue = queue.poll();
if (nodeQueue == null){
continue;
}
System.out.print(nodeQueue +"");
//出队一个数,再找他的左右节点再次入队
queue.offer(nodeQueue.left);
queue.offer(nodeQueue.right);
}
System.out.println();
}
}
4.检查一下
public static void main(String[] args) {
nodeTree a = new nodeTree();
a.creatNodeTree(100);
a.creatNodeTree(110);
a.creatNodeTree(105);
a.creatNodeTree(90);
a.creatNodeTree(95);
a.creatNodeTree(98);
a.creatNodeTree(120);
a.findNodeTree();
}
最终结果,树的存储结构