首先我们先了解下什么是二叉树:
在计算机科学中,二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
简单来说就是一个节点有最多有两个孩子左孩子右孩子,最少可以没有孩子,叫做叶子节点,这样组成的数就叫做二叉树
像这样的树:
1、插入
当插入一列数的时候如 5,8,22,10,1,3,83,46,0,89,-9,54,13我们按照节点比左孩子大,比右孩子小排列树。
首先把5当作根节点,比较8比5大,放在8的有右节点上,8就是5的右孩子,22比5大,应该放在5的右节点,但是5的右孩子是8,所以22应该和8比较,22比8大放在8的右节点上,所22是8的右孩子,比较后得到的二叉树为:
同理,左后得到的二叉树为:
2、删除
如上图,如果想删除节点22,则删除后需要补充8的右节点,需要用22的左右节点补充,补充完后10,83还要是他的左右节点。
所以这个数一定比10大,比83小。即这个数为 22( 要删除的节点) 的左节点的右子树的最大值或者 22( 要删除的节点)右节点的左子树的最小值。即删除后二叉树为:
以下是 实现代码:
package linkLearn;
public class TreeNode {//创建一个树类
public TreeNode leftNode;
public TreeNode rightNode;
public TreeNode preNode;//声明左节点,右节点,父节点
public Integer data;
TreeNode( Integer data){
this.data=data;
}
@Override
public String toString() {
return "节点[左节点=" + leftNode + ", 右节点=" + rightNode + ", 值=" + data + "]";
}
main函数:
package linkLearn;
public class Treebuild {
public static void main(String[] args) {
Integer[] a = {5,8,22,10,1,3,83,46,0,89,-9,54,13};
TreeNode root = new TreeNode(a[0]);//数组第一个数设置为根节点
root.leftNode=null;
root.rightNode = null;
for(int i=1 ,length = a.length;i < length;i++) {
insert( a[i], root);
}
System.out.println(root);
delete(root,83);
System.out.println(root);
search(root,8);
System.out.println(root);
}
public static void insert(Integer data, TreeNode node) {
if( data >node.data ) {
TreeNode childNode = new TreeNode(data);
if( node.rightNode != null ) {
insert( data, node.rightNode );//
}else {
node.rightNode = childNode;
childNode.preNode =node;
}
}else {
TreeNode childNode = new TreeNode(data);
if( node.leftNode != null ) {
insert( data, node.leftNode );
}else {
node.leftNode = childNode;
childNode.preNode =node;
}
}
}
public static void delete(TreeNode root,Integer a) {//删除
//TreeNode child =null;
//child=root.leftNode ;
if(a>root.data ) {
delete(root.rightNode ,a); //进行递归操作
}
if(a<root.data) {
delete(root.leftNode ,a);
}
if(a==root.data ) {
if(root.leftNode ==null&&root.rightNode ==null) {
if(root.preNode.data >a){
root.preNode .leftNode=null;
}else {root.preNode .rightNode=null;}
}
if(root.leftNode !=null&&root.rightNode ==null||root.leftNode ==null&&root.rightNode !=null) {
TreeNode child5 =root.preNode ;
if(child5.data <a) {
if(root.leftNode ==null) {
child5.rightNode =root.rightNode ;
}
else{
child5.rightNode =root.leftNode ;
}
}else {
if(root.leftNode ==null) {
child5.leftNode =root.rightNode ;
}
else{
child5.leftNode =root.leftNode ;
}
}
}
if(root.leftNode !=null&&root.rightNode !=null) {
TreeNode child2=null;
TreeNode child3=null;
TreeNode child4=null;
child3=root.preNode ;
child4=root.leftNode ;
if(root.leftNode .rightNode !=null) {
while(root.leftNode .rightNode.rightNode !=null) {
root.leftNode .rightNode =root.leftNode .rightNode.rightNode ;
}
if(root.leftNode .rightNode.leftNode==null) {
if(child3.data >a) {
child3.leftNode =root.leftNode .rightNode;
child3.leftNode .leftNode =child4 ;
root.leftNode .rightNode=null;
}
else {
child3.rightNode =root.leftNode .rightNode;
child3.rightNode .leftNode =child4 ;
root.leftNode .rightNode=null;
}
}
else {
if(child3.data >a) {
child2=root.leftNode .rightNode.leftNode;
child3.leftNode =root.leftNode .rightNode;
child3.leftNode .leftNode =child4 ;
root.leftNode .rightNode=child2 ;
}else {
child2=root .rightNode.leftNode;
child3.rightNode =root.leftNode .rightNode;
child3.rightNode .leftNode =child4 ;
root.leftNode .rightNode=child2 ;
}
}
}
else{
if(child3.data >a) {
child3.leftNode =child4;
}else {
child3.rightNode =child4;
}
}
}
}
}
public static void search(TreeNode root,Integer a) {//查
if(a>root.data ) {
root.leftNode =null;
search(root.rightNode ,a);
}
if(a<root.data) {
root.rightNode =null;
search(root.leftNode ,a);
}
if(a==root.data) {
root.rightNode =null;
root.leftNode =null;
}
}
}
对数组进行插入删除查找操作后结果:
这是二叉树的添加操作后代码输出:
节点[左节点=节点[左节点=节点[左节点=节点[左节点=null, 右节点=null, 值=-9], 右节点=null, 值=0], 右节点=节点[左节点=null, 右节点=null, 值=3], 值=1], 右节点=节点[左节点=null, 右节点=节点[左节点=节点[左节点=null, 右节点=节点[左节点=null, 右节点=null, 值=13], 值=10], 右节点=节点[左节点=节点[左节点=null, 右节点=节点[左节点=null, 右节点=null, 值=54], 值=46], 右节点=节点[左节点=null, 右节点=null, 值=89], 值=83], 值=22], 值=8], 值=5]
由此可以得到:如上的二叉树。