数据结构与算法-二叉树,前序,后续,中序遍历

树的几个重要元素
1,节点:树里面的元素
2,父子关系:节点之间相连的关系
3,子树:当节点大于1是,其余不相交的节点的集合称作子树
4,度:一个节点拥有子树的数量称作度
5,孩子:节点的子节点
6,双亲节点
7,兄弟节点
9,森林:由N个不相交的树组成

节点的高度:节点到叶子节点的最长路径
节点的深度:根节点到该节点的边个数
节点的层数:节点的深度+1
树的高度:根节点的高度

二叉树
1,每个节点最多有两个节点
2,第N层最多有2^(N-1)个节点
满二叉树:除叶子结点外,每个结点都有左右两个子结点。
完全二叉树:除最后一层外,其他的结点个数必须达到最大,并且最后一层结点都连续靠左排列。
在这里插入图片描述
执行结果如下:
在这里插入图片描述

堆就是一个完全二叉树,主要原因是想借用数组,数组开辟的是连续的空间,可以使用CPU的缓存行

package edu.tree;

/**
 * @author: LHT
 * @date: 2020/12/28 17:53
 */
public class BinaryTree {
    /**
     * 前序遍历  根 左 右
     *
     * @param root
     */
    public void pre(MyTreeNode root) {
        print(root);
        if (root.getLeft() != null) {
            //将左边看做一个新树,根左右
            pre(root.getLeft());
        }
        if (root.getRight() != null) {
            pre(root.getRight());
        }
    }

    /**
     * 中序遍历
     * 左中右
     *
     * @param root
     */
    public void in(MyTreeNode root) {

        if (root.getLeft() != null) {
            //将左边看做一个新树,根左右
            in(root.getLeft());
        }
        print(root);
        if (root.getRight() != null) {
            in(root.getRight());
        }
    }

    /**
     * 后续遍历
     * 左右中
     * O(n)
     *
     * @param root
     */
    public void post(MyTreeNode root) {

        if (root.getLeft() != null) {
            //将左边看做一个新树,根左右
            post(root.getLeft());
        }
        if (root.getRight() != null) {
            post(root.getRight());
        }
        print(root);
    }

    public void print(MyTreeNode node) {
        System.out.print(node.getData() + "  ");
    }

    public static void main(String[] args) {
        MyTreeNode D = new MyTreeNode('D', null, null);
        MyTreeNode H = new MyTreeNode('H', null, null);
        MyTreeNode K = new MyTreeNode('K', null, null);
        MyTreeNode C = new MyTreeNode('C', D, null);
        MyTreeNode G = new MyTreeNode('G', H, K);
        MyTreeNode B = new MyTreeNode('B', null, C);
        MyTreeNode F = new MyTreeNode('F', G, null);
        MyTreeNode E = new MyTreeNode('E', null, F);
        MyTreeNode A = new MyTreeNode('A', B, E);
        BinaryTree binaryTree = new BinaryTree();
        binaryTree.pre(A);
        System.out.print("前");
        System.out.println();
        binaryTree.in(A);
        System.out.println("中");
        binaryTree.post(A);
        System.out.println("后");

    }
}

/**
 * 二叉树定义
 */
class MyTreeNode {

    char data;
    private MyTreeNode left;
    private MyTreeNode right;

    public MyTreeNode(char data, MyTreeNode left, MyTreeNode right) {
        super();
        this.data = data;
        this.left = left;
        this.right = right;
    }

    public char getData() {
        return data;
    }

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

    public MyTreeNode getLeft() {
        return left;
    }

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

    public MyTreeNode getRight() {
        return right;
    }

    public void setRight(MyTreeNode right) {
        this.right = right;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值