二叉树的基本操作

来源:互联网 发布:矩阵图怎么画 编辑:程序博客网 时间:2024/05/22 13:09

二叉树节点的创建

public class Node {    //节点的值    public int data;    //左子节点    public Node leftNode;    //右子节点    public Node rightNode;    /**     * @Description TODO(构造函数)     */    public Node(int data) {        this.data = data;    }}

二叉树节点的创建

public Node root;    /**     * @Description 插入操作     * @param value     */    public void insert(int value) {        Node newNode = new Node(value);        Node current = root;        Node parent;        if (current == null) {            root = newNode;        } else {            while (true) {                parent = current;                if(current.data == value){                    return;                }                if (current.data > value) {                    current = current.leftNode;                    if (current == null) {                        parent.leftNode = newNode;                        return;                    }                 }else if (current.data < value) {                        current = current.rightNode;                        if (current == null) {                            parent.rightNode = newNode;                            return;                        }                    }            }        }    }

二叉树节点的查找

//第一种没有简洁性public void find(int value){        Node current = root;            while(true)            if(current.data == value){                System.out.println("查找到");                return;            }            else if(current.data > value){                if(current.leftNode == null){                    System.out.println("二叉树上没有该值");                    return;                }else{                    current = current.leftNode;                }            }            else if(current.data < value){                if(current.rightNode == null){                    System.out.println("二叉树上没有该值");                    return;                }else{                    current = current.rightNode;                }            }        }//简洁public Node find(long value) {        //引用当前节点,从根节点开始        Node current = root;        //循环,只要查找值不等于当前节点的数据项        while(current.data != value) {            //进行比较,比较查找值和当前节点的大小            if(current.data > value) {                current = current.leftChild;            } else {                current = current.rightChild;            }            //如果查找不到            if(current == null) {                return null;            }        }        return current;    }

二叉树节点的删除

  • 节点没有子节,直接将该节点赋null
  • 节点有一个子节点,将此子节点直接与父节点相连接
  • 节点有左右节点,采用中继后序的方法(将该节点的右节点上的最左边的左子节点的值赋给该节点
public boolean delete(long value) {            //引用当前节点,从根节点开始            Node current = root;            //应用当前节点的父节点            Node parent = root;            //是否为左节点            boolean isleftNode = true;            while(current.data != value) {                parent = current;                //进行比较,比较查找值和当前节点的大小                if(current.data > value) {                    current = current.leftNode                            ;                    isleftNode = true;                } else {                    current = current.rightNode;                    isleftNode = false;                }                //如果查找不到                if(current == null) {                    return false;                }            }            //删除叶子节点,也就是该节点没有子节点            if(current.leftNode == null && current.rightNode == null) {                if(current == root) {                    root = null;                } else if(isleftNode) {                    parent.leftNode = null;                } else {                    parent.rightNode = null;                }            } else if(current.rightNode == null) {                if(current == root) {                    root = current.leftNode;                }else if(isleftNode) {                    parent.leftNode = current.leftNode;                } else {                    parent.rightNode = current.leftNode;                }            } else {                Node successor = getSuccessor(current);                if(current == root) {                    root = successor;                } else if(isleftNode) {                    parent.leftNode = successor;                } else{                    parent.rightNode = successor;                }                successor.leftNode = current.leftNode;            }            return true;        }    //用于寻找左子节点          public Node getSuccessor(Node delNode) {            Node successor = delNode;            Node successorParent = delNode;            Node current = delNode.rightNode;            while(current != null) {                successorParent = successor;                successor = current;                current = current.leftNode;            }            if(successor != delNode.rightNode) {                successorParent.leftNode = successor.rightNode;                successor.rightNode = delNode.rightNode;            }            return successor;        }
原创粉丝点击