`

java实现二叉树

 
阅读更多

参考:二叉树就这么简单数据结构(二)之二叉树

 

public class BinaryTree {
    //根节点
    private Node root;
    /**
     * 树的结点
     */
    private static class Node{
        //数据域
        private  int data;
        //左子结点
        private Node leftChild;
        //右子结点
        private Node rightChild;
        Node( int data){
            this.data = data;
        }
    }

    /**
     * 插入结点
     * @param data
     */
    public void insert( int data){
        Node newNode = new Node(data);
        Node currNode = root;
        Node parentNode;
        //如果是空树
        if(root == null){
            root = newNode;
            return;
        }
        while(true){
            parentNode = currNode;
            //向右搜寻
            if(data > currNode.data){
                currNode = currNode.rightChild;
                if(currNode == null){
                    parentNode.rightChild = newNode;
                    return;
                }
            }else{
                //向左搜寻
                currNode = currNode.leftChild;
                if(currNode == null){
                    parentNode.leftChild = newNode;
                    return;
                }
            }
        }

    }

    /**
     * 前序遍历
     * @param currNode
     */
    public void preOrder(Node currNode){
        if(currNode == null){
            return;
        }
        System.out.print(currNode.data+" ");
        preOrder(currNode.leftChild);
        preOrder(currNode.rightChild);
    }

    /**
     * 中序遍历
     * @param currNode
     */
    public void inOrder(Node currNode){
        if(currNode == null){
            return;
        }
        inOrder(currNode.leftChild);
        System.out.println(currNode.data+" ");
        inOrder(currNode.rightChild);

    }

    /**
     * 后序遍历
     * @param currNode
     */
    public void postOrder(Node currNode){
        if(currNode == null){
            return;
        }
        postOrder(currNode.leftChild);
        postOrder(currNode.rightChild);
        System.out.print(currNode.data+" ");
    }

    /**
     * 查找结点
     * @param data
     * @return
     */
    public Node find( int data){
        Node currNode = root;
        while(currNode!=null){
            if(data>currNode.data){
                currNode = currNode.rightChild;
            }else if(data<currNode.data){
                currNode = currNode.leftChild;
            }else{
                return currNode;
            }
        }
        System.out.println("无此节点"+data);
        return null;
    }

    /**
     * 删除结点 分为3种情况
     * 1.叶子结点
     * 2.该节点有一个子节点
     * 3.该节点有二个子节点
     * @param data
     */
    public boolean delete( int data){
        Node curr = root;
        //保持一个父节点的引用
        Node parent = curr;
        //删除结点是左子结点还是右子结点,
        boolean isLeft = true;
        while(curr != null && curr.data!=data){
            parent = curr;
            if(data > curr.data){
                curr = curr.rightChild;
                isLeft = false;
            }else{
                curr = curr.leftChild;
                isLeft = true;
            }
        }
        if(curr==null){
            System.out.println("要删除的结点"+data+"不存在");
        }
        //第一种情况,要删除的结点为叶子结点
        if(curr.leftChild == null && curr.rightChild == null){
            if(curr == root){
                root = null;
                return true;
            }
            if(isLeft){
                parent.leftChild = null;
            }else{
                parent.rightChild = null;
            }
        }else if(curr.leftChild == null){
            //第二种情况,要删除的结点有一个子节点且是右子结点
            if(curr == root){
                root = curr.rightChild;
                return true;
            }
            if(isLeft){
                parent.leftChild = curr.rightChild;
            }else{
                parent.rightChild = curr.rightChild;
            }
        }else if(curr.rightChild == null){
            //第二种情况,要删除的结点有一个子节点且是左子结点
            if(curr == root){
                root = curr.leftChild;
                return true;
            }
            if(isLeft){
                parent.leftChild = curr.leftChild;
            }else{
                parent.rightChild = curr.leftChild;
            }
        }else{
            //第三种情况,也是最复杂的一种情况,要删除的结点有两个子节点,需要找寻中序后继结点
            Node succeeder = getSucceeder(curr);
            if(curr == root){
                root = succeeder;
                return  true;
            }
            if(isLeft){
                parent.leftChild = succeeder;
            }else{
                parent.rightChild = succeeder;
            }


        }
        return true;
    }
    public Node getSucceeder(Node delNode){
        Node succeeder = delNode;
        Node parent = delNode;
        Node currNode = delNode.rightChild;
        //寻找后继结点
        while(currNode != null){
            parent = succeeder;
            succeeder = currNode;
            currNode = currNode.leftChild;
        }
        //如果后继结点不是要删除结点的右子结点
        if(succeeder != delNode.rightChild){
            parent.leftChild = succeeder.rightChild;
            //将后继结点的左右子结点分别指向要删除结点的左右子节点
            succeeder.leftChild = delNode.leftChild;
            succeeder.rightChild = delNode.rightChild;
        }else{
            //当后继结点为删除结点的右子结点
            succeeder.leftChild = delNode.leftChild;
        }
        return succeeder;

    }

    public int getHeight(Node treeNode) {

        if (treeNode == null) {
            return 0;
        } else {

            //左边的子树深度
            int left = getHeight(treeNode.leftChild);

            //右边的子树深度
            int right = getHeight(treeNode.rightChild);


            int max = left;

            if (right > max) {
                max = right;
            }
            return max + 1;
        }
    }

    /**
     * 找出树的最大值
     *
     * @param rootTreeNode
     */
    public  int  getMax(Node rootTreeNode) {

        if (rootTreeNode == null) {
            return -1;
        } else {
            //找出左边的最大值
            int left = getMax(rootTreeNode.leftChild);

            //找出右边的最大值
            int right = getMax(rootTreeNode.rightChild);

            //与当前根节点比较
            int currentRootValue = rootTreeNode.data;

            //假设左边的最大
            int max = left;


            if (right > max) {
                max = right;
            }
            if (currentRootValue > max) {
                max = currentRootValue;
            }

            return max ;


        }
    }

    public static void main(String []args) throws Exception {
        BinaryTree binaryTree = new BinaryTree();
        //插入操作
        binaryTree.insert(5);
        binaryTree.insert(3);
        binaryTree.insert(1);
        binaryTree.insert(8);
        //前序遍历
        System.out.println("前序遍历:");
        binaryTree.preOrder(binaryTree.root);
        System.out.println();
        //中序遍历
        System.out.println("中序遍历:");
        binaryTree.inOrder(binaryTree.root);
        System.out.println();
        //后序遍历
        System.out.println("后序遍历:");
        binaryTree.postOrder(binaryTree.root);
        System.out.println();
        //查找结点
        Node node = binaryTree.find(5);
        if(node!=null){
            System.out.println("找到结点,其值为:"+node.data);
        }
        //删除结点
        binaryTree.delete(5);
        System.out.println("删除结点,中序遍历:");
        binaryTree.inOrder(binaryTree.root);

        System.out.println("树的深度:"+binaryTree.getHeight(binaryTree.root));
        System.out.println("树的最大值:"+binaryTree.getMax(binaryTree.root));
    }
}

 

 

分享到:
评论

相关推荐

    Java实现二叉树的基本操作

    以上就是Java实现二叉树的基本操作的详细讲解,这些操作对于理解和应用数据结构在实际问题中非常重要。在Java中,二叉树的实现可以帮助我们解决许多算法问题,例如搜索、排序、路径查找等。通过熟练掌握这些操作,...

    java实现二叉树最佳方法

    总之,Java实现二叉树的最佳方法依赖于对二叉树性质的深入理解以及对Java语言特性的熟练应用。递归构建和遍历是实现二叉树的两个核心方面,它们共同构建了复杂二叉树算法的基石。在实际应用中,还需要考虑树结构的...

    Java实现二叉树的遍历

    java实现二叉树非递归前序中序后序遍历

    java实现二叉树数据结构

    java实现二叉树数据结构,简单明了,免费下载

    java实现二叉树遍历demo

    本示例"java实现二叉树遍历demo"将通过一个简单的实例来演示这三种遍历方式。 1. **前序遍历**: 前序遍历的顺序是:根节点 -&gt; 左子树 -&gt; 右子树。在代码实现中,通常采用递归的方法。首先访问根节点,然后递归地...

    Java实现二叉树,Java实现队列.pdf

    【Java实现二叉树】 在Java中,二叉树是一种数据结构,由多个节点组成,每个节点最多有两个子节点,通常分为左子节点和右子节点。二叉树的节点通常包含一个值以及指向其左子节点和右子节点的引用。在提供的代码中,...

    Java实现二叉树的相关操作

    以上就是Java实现二叉树的基本操作,包括创建、插入、删除和搜索节点,以及遍历二叉树的方法。这些操作为处理各种算法问题提供了基础,如二叉搜索树、平衡二叉树、堆等。掌握二叉树的原理和实现对于提升编程能力至关...

    Java实现二叉树中序线索化(图形界面 含代码)

    Java实现二叉树中序线索化 左键画节点 右键画跟 点可以拖动 两个节点可以连线 确认进行线索化 并画出线索

    java实现二叉树遍历算法(源代码)

    ### Java实现二叉树遍历算法详解 #### 一、引言 在计算机科学中,二叉树是一种常用的数据结构,广泛应用于各种算法和数据处理场景。为了更好地理解和操作二叉树,掌握其遍历算法至关重要。本文将详细介绍如何使用...

    Java实现二叉树的先序、中序、后续、层次遍历

    在讲解Java实现二叉树的先序、中序、后序、层次遍历时,我们需要先了解几个关键知识点。 首先,二叉树是一种非常基础且重要的数据结构,每个节点最多有两棵子树,通常称这两棵子树为“左子树”和“右子树”。二叉树...

    java实现二叉树的遍历

    ### Java 实现二叉树的遍历 #### 一、数据结构分类 在计算机科学领域,数据结构可以按照逻辑结构和存储结构进行分类。 - **逻辑结构**: - **集合**:没有逻辑上的关系,如集合中的元素彼此独立。 - **线性结构*...

    用java实现二叉树的创建和遍历.doc

    本篇将详细阐述如何使用Java实现二叉树的创建和遍历。 首先,我们需要创建一个二叉树节点类`FOBiTree.java`,它包含以下属性和方法: 1. `char data`: 存储节点的值,例如字符。 2. `FOBiTree lNode`: 指向左子树...

    java实现二叉树程序

    java用队列实现的二叉树程序//入队 public void enqueue(E e); //出队 public E dequeue(); //取队列第一个 public E front(); //队列是否为空 public boolean isEmpty(); //队列大小 public int size...

    JAVA实现二叉树建立、遍历

    Java作为一种强大的面向对象编程语言,提供了丰富的数据结构支持,包括二叉树的实现。 首先,我们来看如何通过先序和中序序列建立二叉树。先序遍历顺序是:根节点 -&gt; 左子树 -&gt; 右子树;中序遍历顺序是:左子树 -&gt; ...

    Java实现二叉树的层次遍历

    本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的层次顺序访问所有节点。 首先,我们需要定义二叉树节点的数据结构。在`BinaryTree.java`文件中,我们可以创建一个名为`Node`的类来表示树...

    java 二叉树实现

    java二叉树实现 (简单实现,入门用) /**创建二叉树*/ public BinaryTree createTree(String treeStr); /**寻找结点*/ public BinaryTree findNode(BinaryTree tree ,char sign); /**找所给结点的左子树*/ ...

    用Java实现二叉树的深度优先、广度优先遍历

    本篇文章将深入探讨如何使用Java来实现二叉树的深度优先遍历(DFS, Depth First Search)和广度优先遍历(BFS, Breadth First Search)。 **深度优先遍历** 是一种在图或树中搜索的方法,它尽可能深地探索树的分支...

Global site tag (gtag.js) - Google Analytics