package BST;
public class Binary{
public static void main(String[] args) {
int[] array = {6,2,8,3,9,1,4,7};
Tree tree = new Tree();
for (int i = 0;i<array.length;i++){
tree.add(new Node(array[i]));
}
tree.infixOrder();
System.out.println("根节点为:"+tree.getRoot());
Node sN =tree.search(3);
System.out.println(sN);
Node sP = tree.serachP(2);
System.out.println(sP);
tree.delNode(7);
tree.infixOrder();
System.out.println("********************************");
tree.delNode(3);
tree.infixOrder();
System.out.println("********************************");
tree.delNode(6);
tree.infixOrder();
System.out.println("根节点为:"+tree.getRoot());
}
}
/**
*
*/
class Tree{
Node root;
//获取右子树中最小的值,并删除此结点,返回该值
public int delRMax(Node node){
Node temp = node.right;
while(temp.left!=null){
temp = temp.left;
}
delNode(temp.value);
return temp.value;
}
//删除结点
public void delNode(int value){
if (root==null){
System.out.println("空的二叉树~~");
return;
}
//获取目标结点
Node node = root.searchNode(value);
if (node==null){
System.out.println("不存在该节点~~");
}
//获取目标父节点
Node nodeP = root.searchParent(value);
//叶子结点
if (node.left==null&&node.right==null){
if(nodeP.left!=null&&nodeP.left.value==value){
nodeP.left=null;
}else if(nodeP.right!=null&&nodeP.right.value==value){
nodeP.right=null;
}
}else if(node.left==null||node.right==null){//有一个子树
if (node.left!=null){
if(nodeP!=null) {//防止根节点一个子树的情况空指针
if (nodeP.left.value == value) {
nodeP.left = node.left;
} else {
nodeP.right = node.left;
}
}else{
root = node.left;
}
}else{
if(nodeP!=null) {
if (nodeP.left.value == value) {
nodeP.left = node.right;
} else {
nodeP.right = node.right;
}
}else{
root = node.right;
}
}
}else{//有两颗子树
int val = delRMax(node);
node.value=val;
}
}
//封装
public void add(Node node){
if (root==null){
root = node;
}else{
root.add(node);
}
}
public void infixOrder(){
if(root==null){
return;
}else{
root.infixOrder();
}
}
public int getRoot(){
if(root==null){
return -1;
}
else {
return root.value;
}
}
//寻找节点
public Node search(int value){
if(root==null){
return null;
}else{
return root.searchNode(value);
}
}
//寻找父节点
public Node serachP(int value){
if (root==null){
return null;
}
else{
return root.searchParent(value);
}
}
}
class Node {
int value;
Node left;
Node right;
public Node(int value){
this.value = value;
}
public void add(Node node){
if(node==null){
return;
}
if(this.value > node.value){
if (this.left==null){
this.left = node;
}else {
this.left.add(node);
}
}else{
if(this.right ==null){
this.right = node;
}else {
this.right.add(node);
}
}
}
public void infixOrder(){
if (this.left!=null){
this.left.infixOrder();
}
System.out.println(this.value);
if(this.right!=null){
this.right.infixOrder();
}
}
@Override
public String toString() {
return "Node{" +
"value=" + value +
'}';
}
public Node searchNode(int value){
if (this.value==value){
return this;
}
if (this.value>value){
if (this.left!=null) {
return this.left.searchNode(value);
}else {
return null;
}
}else{
if (this.right!=null) {
return this.right.searchNode(value);
}else{
return null;
}
}
}
public Node searchParent(int value){
if((this.left!=null&&this.left.value==value)||(this.right!=null&&this.right.value==value)){
return this;
}
if(this.value>value&&this.left!=null){
return this.left.searchParent(value);
}else if(this.value<=value&&this.right!=null){
return this.right.searchParent(value);
}else{return null;}
}
}
二叉排序树
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- 今天青石的票圈出镜率最高的,莫过于张艺谋的新片终于定档了。 一张满溢着水墨风的海报一次次的出现在票圈里,也就是老谋...
- 一、jQuery简介 JQ是JS的一个优秀的库,大型开发必备。在此,我想说的是,JQ里面很多函数使用和JS类似,所...