美文网首页
二叉树的实现

二叉树的实现

作者: 鹰涯 | 来源:发表于2018-01-09 15:43 被阅读33次

数据结构和算法的重要性毋庸置疑,本文将采用Java语言,来实现基本的二叉树。

实现二叉树对于二叉树本身的理解和递归算法的理解有很大的帮助,话不多说,直接进入主题:

基本数据结构
public class BinaryTree<T>{

    public BinaryTree(Node<T> node){
        this.root = node;
    }

    private Node<T> root == null; //树的根节点

    public static class Node<T> {
        private final T data;  //节点数据
        private Node<T> leftChild = null;   //左节点
        private Node<T> rightChild = null;  //右节点
        public Node(T t){
            this.data = t;
        }
        //...setter 和getter, 注意data无法改变,没有setter方法
    }
}

首先,创建二叉树基类BinaryTree,并实现内部类Node
这里使用泛型类,可灵活的应用于不同数据类型的树。节点为内部类,毕竟不是只有二叉树这种树结构,其他的树结构和二叉树是有一定差异的。

求树的高度和节点数
// 求树的高度
public getHeight(){
    getHeight(root);
}

private int getHeight(Node<T> node) { 
    if (node == null) {  //基线条件
        return 0;
    } else {  //递归条件
        int i = getHeight(node.getLeftChild());
        int j = getHeight(node.getRightChild());
        return i >= j ? i + 1 : j + 1;
    }
}

使用递归算法来求树的高度,树的高度为根节点的左、右子树的高度较大者加1,依次类推。
同理可得,节点数的算法即递归条件改为左、右子数的节点数之和。

public size(){
    size(root)
}

private size(Node<T> node){
    if(node == null){
        return 0;
    } else {
        return size(node.getLeftChild())
            + size(node.getRightChild())
            + 1;
    }
}

计算高度和节点数已经完成,接下来做个小测试


    public static void main(String[] args) {
        BinaryTree.Node<String> root = new BinaryTree.Node<String>("root");
        BinaryTree<String> tree = new BinaryTree<String>(root);
        BinaryTree.Node<String> leftNode = new BinaryTree.Node<String>("left");
        leftNode.setLeftChild(new BinaryTree.Node<String>("left-left"));
        root.setLeftChild(leftNode);
        root.setRightChild(new BinaryTree.Node<String>("right"));

        System.out.println(tree.getHeight());   //输出3
        System.out.println(tree.size());    //输出4
    }

至此,二叉树就基本实现了,是不是对于二叉树的结构和递归算法有了更深入的理解呢?顺便一提,二叉树的三种顺序遍历也是使用递归来实现的。

二叉树的顺序遍历

我们在测试代码中添加遍历的代码

    //定义节点访问方法
    public static void visitNode(BinaryTree.Node<String> node){
        System.out.println(node.getData());
    }

    //先序遍历
    public static void preOrder(BinaryTree.Node<String> node){
        if(node!=null){
            visitNode(node);
            preOrder(node.getLeftChild());
            preOrder(node.getRightChild());
        }
    }
    //中序遍历
    public static void inOrder(BinaryTree.Node<String> node){
        if(node!=null){
            inOrder(node.getLeftChild());
            visitNode(node);
            inOrder(node.getRightChild());
        }
    }
    //后续遍历
    public static void postOrder(BinaryTree.Node<String> node){
        if(node!=null){
            postOrder(node.getLeftChild());
            postOrder(node.getRightChild());
            visitNode(node);
        }
    }

    //测试代码
    System.out.println("先序遍历");
    preOrder(root);
    System.out.println("中序遍历");
    inOrder(root);
    System.out.println("后续遍历");
    postOrder(root);

测试结果如下图所示:


测试结果

另外,如果想让二叉树类的功能更加强大,可以编写相对应的迭代器进行二叉树的遍历,会让客户端代码更为简洁,这里就不再扩展了。

相关文章

  • python实现二叉树

    递归实现二叉树 堆实现二叉树前序遍历

  • 算法之二叉树

    二叉树之C++实现 创建二叉树 复制二叉树 先序遍历 递归实现 非递归实现 中序遍历 递归实现 非递归实现 后序遍...

  • 数据结构之树的相关问题

    实验要求 实现二叉树的抽象数据类型 实现二叉树的建立的运算 实现二叉树的遍历运算 实现创建哈夫曼树的算法 实验代码...

  • 2. 二叉树 BinTree

    二叉树的实现 BinNode : 二叉树结点 二叉树结点结构代码 : 二叉树常用接口实现 将新结点作为左/右孩子插...

  • 二叉树的实现

    二叉树的节点 二叉树的实现 测试

  • 力扣算法 - 翻转二叉树

    翻转二叉树 翻转一棵二叉树。 示例: 输入: 输出: 思路: Java实现 Swift实现

  • 面试算法--递归/循环实现二叉树的前丶中丶后序遍历

    一丶利用二叉树前序顺序构建二叉树 "#" 代表空结点 二丶递归实现二叉树前中后序遍历 三丶循环实现二叉树前中后序遍...

  • Java二叉树的遍历

    Java二叉树的遍历 利用递归和非递归实现二叉树的先序,中序,后序遍历以及使用队列实现二叉树的层次遍历

  • 二叉树查找与节点删除的javascript实现

    前言 紧接前面说过的 二叉树的实现 和 二叉树的遍历,今天来说一下用javascript实现二叉树的查找和节点删除...

  • 数据结构之二叉树

    数据结构之二叉树 递归构造二叉树 二叉树节点: 递归构造: 图示: 递归遍历 递归实现先序遍历 图示: 递归实现中...

网友评论

      本文标题:二叉树的实现

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