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类似,所...