【算法009】二叉搜索树删除节点 有bug,待完善

删除对象无子节点

删除对象无右节点

删除对象有右节点

package com.example.chyer.demo;

import java.util.Stack;

public class Test {

    private String v;
    private Test left;
    private Test right;
    private Test parent;

    public static void main(String[] args) {
        // 初始化二叉树
        Test parent = new Test();
        parent.v = "4";
        parent.left = new Test();
        parent.left.parent = parent;
        parent.left.v = "2";
        parent.left.left = new Test();
        parent.left.left.parent = parent.left;
        parent.left.left.v = "1";
        parent.left.right = new Test();
        parent.left.right.parent = parent.left;
        parent.left.right.v = "3";
        parent.right = new Test();
        parent.right.parent = parent;
        parent.right.v = "6";
        parent.right.left = new Test();
        parent.right.left.parent = parent.right;
        parent.right.left.v = "5";

        parent.delNode("2");
        System.out.println("中序遍历:");
        parent.infixOrder();
    }

    public String toString() {
        return this.v + "-s";
    }

    // 二叉搜索树删除
    public void delNode(String no) {
        // 查找目标节点
        Test delTar = this.preOrderSearch(no);
        if (delTar == null) {
            System.out.println("无相关节点。no:" + no);
            return;
        }
        // 删除对象无子节点
        if (delTar.left == null && delTar.right == null) {
            delTar = null;
            return;
        } else if (delTar.right == null) {
            // 删除对象无右节点
            if (delTar.parent.left == delTar) {
                delTar.parent.left = delTar.left;
            } else if (delTar.parent.right == delTar) {
                delTar.parent.right = delTar.left;
            }
            delTar.left.parent = delTar.parent;
            delTar = null;
            return;
        } else {
            // 删除对象有右节点
            Test minTar = this.getLeft(delTar.right);
            if (delTar.parent.left == delTar) {
                delTar.parent.left = minTar;
            } else if (delTar.parent.right == delTar) {
                delTar.parent.right = minTar;
            }
            minTar.parent = delTar.parent;
            // TODO 未完功能
            delTar = null;
            return;
        }
    }


    public Test getLeft(Test root) {
        Stack<Test> stack = new Stack<>();
        Test node = root;
        while (node != null) {
            stack.push(node);
            node = node.left;
        }
        node = stack.pop();
        if (node != null) {
            return node;
        } else {
            return null;
        }
    }

    // 二叉树查找
    public Test preOrderSearch(String no) {
        System.out.println("进入前序遍历");
        //比较当前结点是不是
        if (this.v == no) {
            return this;
        }
        //1.则判断当前结点的左子节点是否为空,如果不为空,则递归前序查找
        //2.如果左递归前序查找,找到结点,则返回
        Test resNode = null;
        if (this.left != null) {
            resNode = this.left.preOrderSearch(no);
        }
        if (resNode != null) {
            return resNode;
        }
        //1.左递归前序查找,找到结点,则返回,否继续判断,
        //2.当前的结点的右子节点是否为空,如果不空,则继续向右递归前序查找
        if (this.right != null) {
            resNode = this.right.preOrderSearch(no);
        }
        if (resNode != null) {
            return resNode;
        }
        System.out.println("未找到相同节点。");
        return null;
    }

    //编写前序遍历的方法
    public void preOrder() {
        System.out.println(this); //先输出父结点
        //递归向左子树前序遍历
        if (this.left != null) {
            this.left.preOrder();
        }
        //递归向右子树前序遍历
        if (this.right != null) {
            this.right.preOrder();
        }
    }

    //中序遍历
    public void infixOrder() {

        //递归向左子树中序遍历
        if (this.left != null) {
            this.left.infixOrder();
        }
        //输出父结点
        System.out.println(this);
        //递归向右子树中序遍历
        if (this.right != null) {
            this.right.infixOrder();
        }
    }
}
发布了29 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/chyercn/article/details/103244634