二叉查找树java实现



public class Node {


public int data;
public Node left;
public Node right;

public Node(int data, Node left, Node right) {

this.data = data;
this.left = left;
this.right = right;
}
public int getData() {
return data;
}
public void setData(int data) {
this.data = data;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}


}




public class BinaryTreeUtil {


//中序遍历
public static void MiddleVisit(Node root){
if(root==null){
return;
}
MiddleVisit(root.left);
System.out.print(root.data+" ,");
MiddleVisit(root.right);
}
//先序遍历
public static void PreVisit(Node root){
if(root==null){
return ;
}
System.out.print(root.data+" ,");
PreVisit(root.left);
PreVisit(root.right);

}

//后序遍历
public static void latterVisit(Node root){
if(root==null){
return;
}
latterVisit(root.left);
latterVisit(root.right);
System.out.print(root.data+" ,");
}
//删除二叉树上的某个节点
public static void deleteNode(Node root,int data){
if(root==null){
return;
}
Node preNode=null;
Node curNode=root;
   while(curNode!=null){
   
    if(data<curNode.data){
       preNode=curNode; 
    curNode=curNode.left;
}else if(data>curNode.data){
preNode=curNode;
curNode=curNode.right;
}else if(curNode.data==data){
        if(curNode.left==null&&curNode.right!=null){
          if(preNode.left!=null&&preNode.left.data==curNode.data){
        preNode.left=curNode.right;  
          }else if(preNode.right!=null&&preNode.right.data==curNode.data){
         preNode.right=curNode.right;
          }
        }else if(curNode.left!=null&&curNode.right==null){
         
        if(preNode.left!=null&&preNode.left.data==curNode.data){
        preNode.left=curNode.left;  
          }else if(preNode.right!=null&&preNode.right.data==curNode.data){
         preNode.right=curNode.left;
          }
        } else if(curNode.left!=null&&curNode.right!=null){
        Node curLeftMinNode=findMin(curNode);
        deleteNode(curNode, curLeftMinNode.data);
        curNode.data=curLeftMinNode.data;
       
        }else if(curNode.left==null&&curNode.right==null){
         
        if(preNode.left!=null&&preNode.left.data==curNode.data){
        preNode.left=null;  
          }else if(preNode.right!=null&&preNode.right.data==curNode.data){
         preNode.right=null;
          }
        }
return ;
}
   
   }
   
       

}
//根据元素查找节点
public static Node findNode(Node root,int data){
if(root==null){
return null;
}
Node temp=root;
while(temp!=null){
if(data<temp.data){
temp=temp.left;
}else if(data>temp.data){
temp=temp.right;
}else if(temp.data==data){
return temp;
}
}
return null;
}

//插入节点
public static Node insertNode(Node root ,int data){
//递归实现
//
// if(root==null){
// root=new Node(data,null,null);
// }else {
//
// if(data<root.data){
// root.left=insertNode(root.left, data);
// }else{
// root.right=insertNode(root.right, data);
// }
// }


if(root==null){
root=new Node(data,null,null);
}else{
Node n=new Node(data,null,null);
Node temp=root;
while(temp!=null){
if(temp.data>data){
if(temp.left==null){
temp.left=n;
   break;
}
temp=temp.left;
}else{
if(temp.right==null){
temp.right=n;
break;
}
temp=temp.right;
}
}

}

return root;

}

//查找最大值
public static Node findMax(Node root){
if(root==null){
return null;
}
Node result=null;
result=root;
while(result.right!=null){
result=result.right;
}
return result;
}

//查找最小值
public static Node findMin(Node root){

if(root==null){
return null;
}
Node result=null;
result=root;
while(result.left!=null){
result=result.left;
}
return result;
}


}



做一门精致,全面详细的 java数据结构与算法!!!让天下没有难学的数据结构,让天下没有难学的算法,不吹不黑,我们的讲师及其敬业,可以看到课程视频,课件,代码的录制撰写,都是在深夜,如此用心,其心可鉴,他不掉头发,谁掉头发???总之你知道的,不知道的,我们都讲,并且持续更新,走过路过,不要错过,不敢说是史上最全的课程,怕违反广告法,总而言之,言而总之,这门课你值得拥有,好吃不贵,对于你知识的渴求,我们管够管饱话不多说,牛不多吹,我们要讲的本门课程内容:稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉树、二叉树与数组转换、二叉排序树(BST)、AVL树、线索二叉树、赫夫曼树、赫夫曼编码、多路查找树(B树B+树和B*树)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值