美文网首页
构建查找二叉树

构建查找二叉树

作者: czins | 来源:发表于2016-10-13 18:42 被阅读148次

public class SearchBinaryTree {

    private static class TreeNode {

        private int data;
        private TreeNode leftNode;
        private TreeNode rightNode;
        private TreeNode parentNode;

        public TreeNode(int data, TreeNode parentNode) {
            this.data = data;
            this.parentNode = parentNode;
        }

        @Override
        public String toString() {
            return "TreeNode [data=" + data + ", leftNode=" + (leftNode != null ? leftNode.data : null) + ", rightNode="
                    + (rightNode != null ? rightNode.data : null) + ", parentNode="
                    + (parentNode != null ? parentNode.data : null) + "]";
        }
    }

    private TreeNode rootNode;

    public TreeNode put(int data) {
        if (rootNode == null) {
            rootNode = new TreeNode(data, null);
            return rootNode;
        }
        TreeNode node = rootNode;
        if (data == node.data) {
            return node;
        }
        TreeNode parentNode = null;
        while (node != null) {
            parentNode = node;
            if (data > node.data) {
                node = node.rightNode;
            } else {
                node = node.leftNode;
            }
        }
        node = new TreeNode(data, parentNode);
        if (node.data < parentNode.data) {
            parentNode.leftNode = node;
        } else {
            parentNode.rightNode = node;
        }
        return node;
    }

    public void removeNode(int data) {
        TreeNode node = findNode(data);
        if (node == null) {
            return;
        }
        TreeNode parentNode = node.parentNode;
        // 删除的是root节点
        if (parentNode == null) {
            if (node.rightNode != null) {
                rootNode = node.rightNode;
                rootNode.parentNode = null;
            } else if (node.leftNode != null) {
                rootNode = node.leftNode;
                rootNode.parentNode = null;
            } else {
                rootNode = null;
            }
        }
        // 找出删除节点右树中最小的节点
        TreeNode minimumNode = findMinimumNode(node.rightNode);
        // 如果含有该最小节点,则该最小节点的左树节点为null
        if (minimumNode != null) {
            // 如果有左节点,将其挂载到这个最小节点上
            if (node.leftNode != null) {
                minimumNode.leftNode = node.leftNode;
                node.leftNode.parentNode = minimumNode;
            }
            if (parentNode != null) {
                if (node.data < parentNode.data) {
                    // 删除的是左树节点
                    parentNode.leftNode = node.rightNode;
                    node.rightNode.parentNode = parentNode;
                } else {
                    // 删除的是右树节点
                    parentNode.rightNode = node.rightNode;
                    node.rightNode.parentNode = parentNode;
                }
            }
        } else if (node.leftNode != null) {
            // 只有左树节点
            if (parentNode != null) {
                parentNode.leftNode = node.leftNode;
                node.leftNode.parentNode = parentNode;
            }
        } else {
            // 没有子节点
            if (parentNode != null) {
                if (node.data < parentNode.data) {
                    // 删除的是左树节点
                    parentNode.leftNode = null;
                } else {
                    // 删除的是右树节点
                    parentNode.rightNode = null;
                }
            }
        }
        node.parentNode = null;
        node.leftNode = null;
        node.rightNode = null;
    }

    private TreeNode findMinimumNode(TreeNode node) {
        TreeNode parentNode = node;
        while (node != null) {
            parentNode = node;
            node = node.leftNode;
        }
        return parentNode;
    }

    public TreeNode findNode(int data) {
        TreeNode node = rootNode;
        while (node != null) {
            if (data < node.data) {
                node = node.leftNode;
            } else if (data > node.data) {
                node = node.rightNode;
            }
            if (node == null || node.data == data) {
                break;
            }
        }
        return node;
    }

    // 中序遍历所有数据,会从小到大排序
    public static void midPrint(TreeNode node) {
        if (node == null) {
            return;
        }
        midPrint(node.leftNode);
        System.out.print(node.data + " ");
        midPrint(node.rightNode);
    }

    public static void main(String[] args) {
        SearchBinaryTree binaryTree = new SearchBinaryTree();
        int[] dataArray = new int[] { 10, 23, 42, 5, 1, 20, 22, 34, 25, 90, 14, 60 };
        for (int data : dataArray) {
            binaryTree.put(data);
        }
        SearchBinaryTree.midPrint(binaryTree.rootNode);
        System.out.println();
        TreeNode node = binaryTree.findNode(1);
        System.out.println(node.toString());
        for (int data : dataArray) {
            binaryTree.removeNode(data);
            SearchBinaryTree.midPrint(binaryTree.rootNode);
            System.out.println();
        }
    }
}

相关文章

  • 6. 二叉树创建-查找

    1. 递归方式实现二叉树的构建2. 树、二叉树、二叉查找树3. 二叉树排序树的理解4. 二叉查找树5. 二叉树的查找

  • 构建查找二叉树

  • 堆排序

    原理 利用完全二叉树的性质,构建堆积树,快速查找到目标元素 基本思想:把待排序的元素按照大小在二叉树位置上排列,排...

  • 树 - 实现二叉排序树(Java)

    链表实现二叉树的类型声明(Java): 二叉树的构建 调用(Kotlin写法): 二叉树构建过程分解:

  • 二叉树 堆 2019-04-17

    二叉树 实现一个二叉查找树,并且支持插入、删除、查找操作 实现查找二叉查找树中某个节点的后继、前驱节点 实现二叉树...

  • 求解二叉树中两个结点的最低公共父结点

    构建一棵二叉树(不一定是二叉查找树),求出该二叉树中某两个结点的最低公共父结点。借用一张图如下: 结点8 和 结点...

  • PHP二叉树之前序、中序、后序遍历

    关于PHP里二叉树如何构建请阅读:PHP二叉树之构建二叉树[https://www.jianshu.com/p/d...

  • 《数据结构与算法》知识点(四)

    第七章 查找 顺序查找、折半查找、索引查找、分块查找是静态查找,动态查找有二叉排序树查找,最优二叉树查找,键树查找...

  • AVL tree | 平衡二叉树

    参考:胡凡,曾磊《算法笔记》 引子 使用有序序列构建BST会形成链式的二叉树,此时查找的复杂度会达到O(n),达不...

  • 7天练|Day5:二叉树和堆

    关于二叉树和堆的7个必知必会的代码实现二叉树实现一个二叉查找树,并且支持插入、删除、查找操作实现查找二叉查找树中某...

网友评论

      本文标题:构建查找二叉树

      本文链接:https://www.haomeiwen.com/subject/jczwyttx.html