二叉树Java实现

本文详细介绍了二叉树的Java实现,包括先序、中序和后序遍历,搜索,插入,删除,以及查找前继和后继节点的方法。通过具体的源码解析,帮助读者深入理解二叉树的操作原理。

定义

二叉树的定义是每个节点最多两个子节点,左子节点始终小于根节点,右子节点始终大于根节点。

相关概念

遍历

先序遍历

先访问根节点,再访问左子叶节点,最后访问右子叶节点

中序遍历

先访问左子节点,再访问根节点,最后访问右子节点,对每个节点访问时都执行以上规则,从而输出从小到大的排序

后序遍历

先访问左子叶节点,再访问右子叶节点,最后访问根节点

搜索

搜索过程模拟了就是一个二分搜索法

前继节点

小于当前节点值的最大节点

后继节点

大于当前节点值的最小节点

源码

package com.company;


public class BinaryTree<T extends Comparable> {
    private Node root;

    class Node {
        private Node left, right, parent;
        private T value;

        public Node(T value) {
            this.value = value;
        }
    }

    //先序遍历
    public void traversePreOrder(Node node) {
        if (node != null) {
            System.out.println(node.value);
            traversePreOrder(node.left);
            traversePreOrder(node.right);
        }
    }

    //中序遍历
    public void traverseInOrder(Node node) {
        if (node != null) {
            traverseInOrder(node.left);
            System.out.println(node.value);
            traverseInOrder(node.right);
        }
    }

    //后序遍历
    public void traversePostOrder(Node node) {
        if (node != null) {
            traversePostOrder(node.left);
            traversePostOrder(node.right);
            System.out.println(node.value);
        }
    }

    //搜索
    public Node search(T value) {
        return search(root, value);
    }

    //搜索
    public Node search(Node node, T value) {
        if (value != null && node != null && node.value != null) {
            while (node != null && !value.equals(node.value)) {
                int diff = value.compareTo(node.value);
                if (diff < 0) {
                    node = node.left;
                } else {
                    node = node.right;
                }
            }
            return node;
        }
        return null;
    }

    //最小值
    public Node min(Node node) {
        if (node != null) {
            while (node.left != null) {
                node = node.left;
            }
        }
        return node;
    }

    //最大值
    public Node max(Node node) {
        if (node != null) {
            while (node.right != null) {
                node = node.right;
            }
        }
        return node;
    }

    //插入
    public void insert(T key) {
        insert(new Node(key));
    }

    //插入
    public void insert(Node node) {
        if (node != null && node.value != null) {
            Node start = root;
            Node parent = null;
            int diff = 0;
            while (start != null) {
                parent = start;
                diff = node.value.compareTo(start.value);
                if (diff < 0) {
                    start = start.left;
                } else if (diff > 0) {
                    start = start.right;
                } else {
                    return;
                }
            }
            if (parent == null) {
                root = node;
            } else {
                node.parent = parent;
                if (diff < 0) {
                    parent.left = node;
                } else {
                    parent.right = node;
                }
            }
        }
    }

    //前驱节点
    public Node predecessor(Node node) {
        if (node != null && node.left != null) {
            return max(node.left);
        }
        Node parent = node.parent;
        Node sub = node;
        while (parent != null) {
            if (parent.right == sub) {
                return parent;
            }
            sub = parent;
            parent = parent.parent;
        }
        return null;
    }

    //后驱节点
    public Node successor(Node node) {
        if (node != null && node.right != null) {
            return min(node.right);
        }
        Node parent = node.parent;
        Node sub = node;
        while (parent != null) {
            if (parent.left == sub) {
                return parent;
            }
            sub = parent;
            parent = parent.parent;
        }
        return null;
    }

    //删除,返回被删除节点
    public Node delete(T key) {
        Node aimNode = search(key);
        delete(aimNode);
        return aimNode;
    }

    //删除,返回被删除节点
    public Node delete(Node node) {
        if (node != null) {
            Node deleteIndex = null;
            if (node.left == null || node.right == null) {
                deleteIndex = node;
            } else {
                deleteIndex = successor(node);
            }
            Node sub;
            if (deleteIndex.left != null) {
                sub = deleteIndex.left;
            } else {
                sub = deleteIndex.right;
            }
            if (sub != null) {
                sub.parent = deleteIndex.parent;
            }
            if (deleteIndex.parent == null) {
                root = sub;
            } else if (deleteIndex == deleteIndex.parent.left) {
                deleteIndex.parent.left = sub;
            } else {
                deleteIndex.parent.right = sub;
            }
            if (deleteIndex != node) {
                node.value = deleteIndex.value;
            }
        }
        return node;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值