`

JAVA实现二叉树

    博客分类:
  • java
 
阅读更多
一、分析

  一个二叉树节点有三个部分,一个是指向左子树的部分,一个是指向右子树的部分,另外一个是数据部分。可以把这个节点抽象成一个节点对象,给对象有两个节点对象属性和一个数据属性。如下图:





  一个二叉树有只有一个根节点,其余的都是根节点的直接或间接子节点。所以可以把二叉树抽象成一个对象,该对象有一个节点类型的数据,也就是用来保存根节点。如下图:




package com.algorithms.treee;

/**
 * 二叉树
 */
public class BinaryTree
{
    private TreeNode root;// 根节点

    public BinaryTree()
    {
    }

    public BinaryTree(TreeNode root)
    {
        this.root = root;
    }

    public TreeNode getRoot()
    {
        return root;
    }

    public void setRoot(TreeNode root)
    {
        this.root = root;
    }

    /**
     * 定义节点
     */
    private static class TreeNode
    {
        private String data = null;// 数据部分
        private TreeNode left;// 左节点的引用
        private TreeNode right;// 右节点的引用

        public TreeNode()
        {
        }

        public TreeNode(String data, TreeNode left, TreeNode right)
        {
            this.data = data;
            this.left = left;
            this.right = right;
        }

        public String getData()
        {
            return data;
        }

        public void setData(String data)
        {
            this.data = data;
        }

        public TreeNode getLeft()
        {
            return left;
        }

        public void setLeft(TreeNode left)
        {
            this.left = left;
        }

        public TreeNode getRight()
        {
            return right;
        }

        public void setRight(TreeNode right)
        {
            this.right = right;
        }

    }

    /**
     * 返回父结点
     * 
     * @param element
     * @return
     */
    public TreeNode getParent(TreeNode element)
    {
        return (root == null || root == element) ? null : parent(root, element);
    }

    public TreeNode parent(TreeNode subTree, TreeNode element)
    {
        if (subTree == null)
            return null;
        if (subTree.getLeft() == element || subTree.getRight() == element)
            // 返回父结点地址
            return subTree;
        TreeNode p;
        // 现在左子树中找,如果左子树中没有找到,才到右子树去找
        if ((p = parent(subTree.getLeft(), element)) != null)
            // 递归在左子树中搜索
            return p;
        else
            // 递归在右子树中搜索
            return parent(subTree.getRight(), element);
    }

    /**
     * 节点个数
     * 
     * @return
     */
    public int getSize()
    {
        return getNum(root);
    }

    private int getNum(TreeNode node)
    {
        if (node == null)
        {
            return 0;
        }
        else
        {
            int i = getNum(node.getLeft());
            int j = getNum(node.getRight());
            return j + i + 1;
        }
    }

    /**
     * 树高度
     * 
     * @return
     */
    public int getHeight()
    {
        return getHeight(root);
    }

    private int getHeight(TreeNode node)
    {
        if (node == null)
            return 0;// 递归结束:空树高度为0
        else
        {
            int i = getHeight(node.getLeft());
            int j = getHeight(node.getRight());
            return (i < j) ? (j + 1) : (i + 1);
        }
    }

    /**
     * 前序遍历
     * 
     * @param node
     */
    public void preOrder(TreeNode node)
    {
        if (node != null)
        {
            System.out.println(node.getData());
            preOrder(node.getLeft());
            preOrder(node.getRight());
        }
    }

    /**
     * 中序遍历
     * 
     * @param node
     */
    public void inOrder(TreeNode node)
    {
        if (node != null)
        {
            preOrder(node.getLeft());
            System.out.println(node.getData());
            preOrder(node.getRight());
        }
    }

    /**
     * 后续遍历
     * 
     * @param node
     */
    public void postOrder(TreeNode node)
    {
        if (node != null)
        {
            preOrder(node.getLeft());
            preOrder(node.getRight());
            System.out.println(node.getData());
        }
    }

    public static void main(String[] args)
    {

        TreeNode l2 = new TreeNode("left2", null, null);
        TreeNode r2 = new TreeNode("right2", null, null);

        TreeNode l1 = new TreeNode("left1", null, r2);// 根节点左子树
        TreeNode r1 = new TreeNode("right1", null, l2);// 根节点右子树
        TreeNode root = new TreeNode("root", l1, r1);// 创建根节点

        BinaryTree bt = new BinaryTree(root);
        System.out.println("=======先序遍历======");
        bt.preOrder(bt.getRoot());
        System.out.println("=======中序遍历======");
        bt.inOrder(bt.getRoot());
        System.out.println("========后续遍历=======");
        bt.postOrder(bt.getRoot());
        System.out.println("===========");
        System.out.println(bt.getHeight());
        System.out.println(bt.getSize());

        System.out.println(bt.getParent(l2).getData());
    }
}


转自:http://www.cnblogs.com/always-online/p/3577153.html
  • 大小: 1.4 KB
  • 大小: 4.2 KB
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    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实现2叉树 的一些简单的算法 例如 删除 插入 查找

    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