Java 實現二叉樹 kaki的博客

Java 實現二叉樹 kaki的博客

二叉樹圖
在這裏插入圖片描述

二叉樹實現代碼

package com.icbc.common;

/**
 * @author Kaki Nakajima
 * @desc 二叉樹
 * @date 2019.05.24
 */
public class MyTree {


    //根節點
    private Node root;

    private class Node{
        public Node(Object data){
            this.data = data;
        }

        Node left;
        Node right;
        Node parrent;
        Object data;
    }

    //查找父節點
    private Node findParrent(Node curentNode,Object data){
        Node parrent = curentNode;
        Node node = curentNode;

        while (node != null){
            //記錄父節點
            parrent = node;

            //比較
            if(compare(node.data, data)){
                //左找
                node = node.left;
            }else {
                node = node.right;
            }
        }
        return parrent;

    }

    //比較大小
    private boolean compare(Object o1,Object o2){
        boolean res = false;

        if(o1 instanceof Comparable){
            Comparable c1 = (Comparable)o1;
            Comparable c2 = (Comparable)o2;
            if(c1.compareTo(c2)>0){
                res = true;
            }
        }else {
            if(o1.toString().compareTo(o2.toString())>0){
                res = true;
            }
        }
        return res;
    }

    //添加
    public void add(Object data){

        Node node = find(data);

        if(node == null){
            //不存在,就添加
            node = new Node(data);

            //判斷添加在哪個位置
            if(root == null){
                root =node;
            }else {
                //查詢父節點
                Node parrent = findParrent(root, data);

                node.parrent = parrent;

                //判斷插在父節點的左邊還是右邊
                if(compare(parrent.data, data)){
                    //比父節點大,就放在父節點左邊
                    parrent.left = node;
                }else {
                    //比父節點小,就放在父節點右邊
                    parrent.right = node;
                }



            }
        }else {
            //該數據已存在,不添加
        }
    }

    //查找數據在二叉樹中的位置
    private Node find(Object data){
        //從跟節點開始遍歷
        Node temp = root;
        while (temp != null){
            if(temp.data.equals(data)&& temp.data.hashCode() == data.hashCode()){
                //找到了
                break;
            }else {
                if(compare(temp.data, data)){
                    //左邊找
                    temp= temp.left;
                }else {
                    //右邊找
                    temp = temp.right;
                }
            }
        }
        return temp;
    }

    // 打印
    public void print(){
        print(root);
    }

    //迭代二叉樹的數據
    private void print(Node node){
        if(node == null){
            return;
        }else {
            print(node.left);
            System.out.println(node.data);
            print(node.right);
        }
    }


    public void remove(Object data) {
        // 1. 查找數據的位置
        Node node = find(data);
        // 2. 存在刪除
        if (node != null) {
            // 存在
            if (node == root) {
                // 刪除根節點
                if (node.left == null && node.right == null) {
                    // 沒有兒子
                    root = null;
                } else if (node.left == null) {
                    // 只有右兒子
                    root = node.right;
                    root.parrent = null;
                } else if (node.right == null) {
                    // 只有左兒子
                    root = node.left;
                    root.parrent = null;
                } else {
                    // 連個兒子都有
                    Node left = splitNode(node);// 分裂節點
                    // 繼位
                    root = left;
                    root.parrent = null;
                }
            } else {
                // 刪除非根節點
                // 刪除根節點
                if (node.left == null && node.right == null) {
                    // 沒有兒子
                    // 刪除node
                    if (compare(node.data, node.parrent.data)) {
                        // 在父節點的右邊
                        node.parrent.right = null;
                    } else {
                        // 在父節點的左邊
                        node.parrent.left = null;
                    }

                } else if (node.left == null) {
                    // 只有右兒子
                    if (compare(node.data, node.parrent.data)) {
                        // 在父節點的右邊
                        node.parrent.right = node.right;
                    } else {
                        // 在父節點的左邊
                        node.parrent.left =  node.right;
                    }
                    node.right.parrent = node.parrent;
                } else if (node.right == null) {
                    // 只有左兒子
                    // 只有右兒子
                    if (compare(node.data, node.parrent.data)) {
                        // 在父節點的右邊
                        node.parrent.right = node.left;
                    } else {
                        // 在父節點的左邊
                        node.parrent.left =  node.left;
                    }
                    node.left.parrent = node.parrent;
                } else {
                    // 連個兒子都有
                    Node left = splitNode(node);// 分裂節點
                    if (compare(left.data, node.parrent.data)) {
                        //右邊
                        node.parrent.right = left;
                        left.parrent = node.parrent;
                    } else {
                        //左邊
                        node.parrent.left = left;
                        left.parrent = node.parrent;
                    }
                }
            }
        }
    }

    /**
     * 分裂節點
     *
     * @param slitNode
     * @return
     */
    private Node splitNode(Node slitNode) {
        // 保留左兒子
        Node left = slitNode.left;

        // 處理右兒子節點,把右兒子放到左兒子的最右邊
        Node parrent = findParrent(left, slitNode.right.data);

        // 重組節點
        parrent.right = slitNode.right;
        slitNode.right.parrent = parrent;
        return left;
    }


}

歡迎點贊關注收藏哦 ,碼雲搜索KakiNakajima

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章