有序二叉树的构建
第一个节点是空节点,如果新插入的数比节点小,则放在左边,如果比节点大,放在右边。
构建节点的方法
利用递归的方式进行构建
利用非递归的方式进行构建--循环遍历
插入节点的步骤
1.首先判断节点和要插入的节点的值的大小
2.如果当前节点大,那么新插入的节点向判断当前节点的左子树是否有数据,
3.如果没有数据则直接插入,如果有数据,向左走,重复上述1.2步
4.如果当前节点小,那么新插入的节点向判断当前节点的右子树是否有数据,
3.如果没有数据则直接插入,如果有数据,向右走,重复上述1.2步
如果要构建一棵树,首先要构建树的节点
java是如何构建节点的?
对于C语言,可以通过利用结构体构建
java利用类与对象,java的一个节点就是一个对象,类是构建对象的模板
程序流程:
5 7 9 4
首先main方法入栈,创建一个tree对象,首先在tree对象中有一个全局变量root
然后不断地调入方法入栈,首先调入insert方法入栈
insert方法首先会创建一个对象newNode,内存中会分配给该对象,一个内存空间
然后盘对root是否为空,如果为空,那么j就将newNode对应地地址分配给root对象
if(root==null) {
root = newNode;
return;//确定节点位置,程序结束
}
这个语句中=前面是变量,等号后面的是地址值。
这一步相当于创建了一个节点5,而且有一个root指针指向当前节点。
构建到此,insert(5)的方法出栈
然后重新调用一个新的insert方法,insert(7)入栈
然后我们比较新加入的节点值和root节点值的大小,7>5,继续判断root的右节点值是否为空,如果为空,直接插入,即将的新节点的地址值赋给root右节点
方法出栈,insert(9)调入进栈
再次新创建变量newNode并给它分配空间
需要一个指针,帮助我们进行数据
定义了一个tempNode,将root对应的地址赋给tempNode,然后比较5和7 的值的大小
发现5的右边为空,所以直接挂上去,接下来是9
此时tempNode指向5,然后比较5和9的值,发现5>9,所以在观察5的右节点是否为空,发现不为空,这个时候需要7和9进行比较,所以将tempNode指向7,即将7的地址值赋给tempNode
tempNode=tempNode.rightNode
然后重新进行判断,9和7再次进行比较,9>7,并且7的右节点为空,将9的地址值赋给7的右节点,实现插入
insert(9)出栈,insert(4)入栈
创建一个新节点newNode
tempNode再次指向root,然后tempNode指向的5和4进行比较,发现4
while(newNode.data
if (tempNode.leftNode==null) {//如果根节点的右子树为空
root.leftNode=newNode;
return;
}else {
tempNode=tempNode.leftNode;//将左侧节点的地址赋给tempnode
//重新向左边进行比较
}
首先判断5的左节点是否为空,如果为空,将新节点的地址值赋给5的左节点
然后insert(4)出栈,insert(3)入栈
判断3小于5,并且5的左节点不为空,将5的左节点4的地址值赋给tempNode,继续进行判断,3小于4,并且4的左侧节点为空,直接插入。
package com.tree;
public class Tree {
public TreeNode root;//指针,指向根节点
public void insert(int value) {
TreeNode newNode=new TreeNode(value);
if(root==null) {
root=newNode;
return;//确定节点位置,程序结束
}
//创建一个指针,让指针帮助我们进行数据对比
TreeNode tempNode=root;//将root地址付给tempNode
while(true) {
while(newNode.data>tempNode.data) {
if (tempNode.rightNode==null) {//如果根节点的右子树为空
root.rightNode=newNode;
return;
}else {
tempNode=tempNode.rightNode;//将右侧节点的地址赋给tempnode
//重新向右边进行比较
}
}
while(newNode.data<=tempNode.data) {
if (tempNode.leftNode==null) {//如果根节点的右子树为空
root.leftNode=newNode;
return;
}else {
tempNode=tempNode.leftNode;//将左侧节点的地址赋给tempnode
//重新向左边进行比较
}
}
}
}
}
看完这篇文章,别忘了点击收藏,加关注呦
你就是未来大佬