手写一个简单的二叉树

简介: 手写一个简单的二叉树

1 概念

       二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

       二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点 。

二叉树的遍历:

      遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。由于二叉树是非线性结构,因此,树的遍历实质上是将二叉树的各个结点转换成为一个线性序列来表示

2 数据结构:

3 代码实现

节点类:
/**
 * @author 17122
 * 节点类
 */
public class Node<E> {
    /**
     * 节点的权(值)
     */
    private E value;
    /**
     * 左儿子
     */
    Node<E> leftNode;
    /**
     * 右儿子
     */
    Node<E> rightNode;
    public Node(E value) {
        this.value = value;
    }
    /**
     * 设置左儿子
     *
     * @param leftNode
     */
    public void setLeftNode(Node<E> leftNode) {
        this.leftNode = leftNode;
    }
    /**
     * 设置右儿子
     *
     * @param rightNode
     */
    public void setRightNode(Node<E> rightNode) {
        this.rightNode = rightNode;
    }
    /**
     * 前序遍历
     */
    public void frontShow() {
        //先遍历当前节点的内容
        System.out.print(value + " ");
        //左节点
        if (leftNode != null) {
            leftNode.frontShow();
        }
        //右节点
        if (rightNode != null) {
            rightNode.frontShow();
        }
    }
    /**
     * 中序遍历
     */
    public void midShow() {
        //左子节点
        if (leftNode != null) {
            leftNode.midShow();
        }
        //当前节点
        System.out.print(value + " ");
        //右子节点
        if (rightNode != null) {
            rightNode.midShow();
        }
    }
    /**
     * 后序遍历
     */
    public void afterShow() {
        //左子节点
        if (leftNode != null) {
            leftNode.afterShow();
        }
        //右子节点
        if (rightNode != null) {
            rightNode.afterShow();
        }
        //当前节点
        System.out.print(value + " ");
    }
}
二叉树类:
/**
 * @author 17122
 * 二叉树类
 */
public class MyBinaryTree<E> {
    private Node<E> root;
    public MyBinaryTree() {
        this.root = null;
    }
    public MyBinaryTree(Node<E> root) {
        this.root = root;
    }
    /**
     * 设置根节点
     *
     * @param root
     */
    public void setRoot(Node<E> root) {
        this.root = root;
    }
    /**
     * 获取根节点
     *
     * @return
     */
    public Node<E> getRoot() {
        return root;
    }
    /**
     * 前序遍历
     */
    public void frontShow() {
        if (root != null) {
            root.frontShow();
        }
    }
    /**
     * 中序遍历
     */
    public void midShow() {
        if (root != null) {
            root.midShow();
        }
    }
    /**
     * 后序遍历
     */
    public void afterShow() {
        if (root != null) {
            root.afterShow();
        }
    }
}
测试:
/**
     * 测试方法
     *
     * @param args
     */
    public static void main(String[] args) {
        MyBinaryTree tree = new MyBinaryTree();
        Node root = new Node(1);
        root.leftNode = new Node(2);
        root.rightNode = new Node(3);
        tree.setRoot(root);
        tree.frontShow();
        System.out.println();
        tree.afterShow();
    }
输出:


相关文章
|
Java
面试题-手写一个单向链表
面试题-手写一个单向链表
100 0
|
5月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
127 2
|
存储
手写单链表实现数据排序
手写单链表实现数据排序
55 0
|
Java
java实现树的前序遍历,递归和非递归实现(简单明了)
java实现树的前序遍历,递归和非递归实现(简单明了)
121 0
|
存储 Java
二叉树的迭代器手写实现
二叉树的迭代器手写实现
|
Java
手写红黑树笔记
写这篇文章的目的 红黑树很重要,所以学一下,整理一下笔记
108 0
手写红黑树笔记
|
存储 算法
手写一个简单的二叉树
手写一个简单的二叉树
|
存储 算法 数据可视化
35+,如果面试让我手写红黑树!
为啥,面试官那么喜欢让你聊聊 HashMap?因为 HashMap 涉及的东西广,用到的数据结构多,问题延展性好,一个 HashMap 就能聊下来80%的数据结构了。而且面试 HashMap 能通过你对红黑树的了解定位出你哪个级别的研发人员。
248 0
面试官让我手写一个平衡二叉树,我当时就笑了
平衡二叉树对于初学者一直是一个比较复杂的知识点,因为其里面涉及到了大量的旋转操作。把大量的同学都给转晕了。这篇文章最主要的特点就是通过动画的形式演示。确保大家都能看懂。最后是手写一个平衡二叉树。
225 0
面试官让我手写一个平衡二叉树,我当时就笑了
|
算法 搜索推荐
面试官:手写一个归并排序,并对其改进
之前曾介绍过快排、冒泡、插入等排序算法,这篇文章介绍一下归并排序。也算是一个比较有名的排序算法。
302 0
面试官:手写一个归并排序,并对其改进