zoukankan      html  css  js  c++  java
  • 二叉树(一)

    二叉树

    1. 为什么需要数这种数据结构,它能解决什么问题?

      1. 数组存储方式的分析

        • 优点:通过下标方式访问元素,速度快。对于有序数组,还可以通过二分查找提高检索速度

        • 缺点:如果要检索具体某个值,或者插入值会整体移动,效率比较低

      2. 链式存储方式的分析

        • 优点:在一定程度上对数组存储方式有优化(比如:插入一个数值节点,只需要将插入节点,链接到链表中即可,删除效率也比较高)

        • 缺点:在进行检索时,效率还是比较低

      3. 树存储方式的分析

        • 能提高数据存储、读取效率,比如利用二叉排序树,既可以保证数据的检索速度,同时也可以保证数据的插入、删除、修改速度

    2. 二叉树

      1. 二叉树的概念:每个节点最多只能有两个子节点的一种形式的树称为二叉树,二叉树的子节点分为左节点和右节点

      2. 如果该二叉树的所有叶子节点都在最后一层并且节点数=2^n-1,n为层数,,则我们称为满二叉树

      3. 如果该二叉树的所有叶子节点都在最后一层或者倒数第二层,而且最后一层的叶子节点在左边连续,倒数第二层的叶子节点在右边连续,我们称为完全二叉树

    3. 二叉树的前序、中序、后序的遍历步骤

      1. 创建一颗二叉树

      2. 前序遍历

        1. 先输入当前节点(初始的时候是根节点)

        2. 如果左子节点不为空,则递归继续前序遍历

        3. 如果右子节点不为空,则递归继续前序遍历

      3. 中序遍历

        1. 如果当前节点的左子节点不为空,则递归中序遍历

        2. 输出当前节点

        3. 如果当前节点的右子节点不为空,则递归中序遍历

      4. 后序遍历

        1. 如果当前节点的左子节点不为空,则递归后序遍历

        2. 如果当前节点的右子节点不为空,则递归后序遍历

        3. 输出当前节点

      5. 代码

    package com.gcy.tree;
    /**
    * 二叉树
    * @author Administrator
    *
    */
    public class BinaryTreeDemo {

    public static void main(String[] args) {

    }

    }
    //定义一个BinaryTree即二叉树
    class BinaryTree{
    private HeroNode root;
    public void setRoot(HeroNode root) {
    this.root=root;
    }
    //前序遍历
    public void preOrder() {
    if(this.root!=null) {
    this.root.preOrder();
    }else {
    System.out.println("当前二叉树为空,无法遍历");
    }
    }
    //中序遍历
    public void infixOrder() {
    if(this.root!=null) {
    this.root.infixOrder();
    }else {
    System.out.println("二叉树为空,无法遍历");
    }
    }
    //后序遍历
    public void postOrder() {
    if(this.root!=null) {
    this.root.postOrder();
    }else {
    System.out.println("二叉树为空,无法遍历");
    }
    }
    }

    //先创建HeroNode节点
    class HeroNode{
    private int no;
    private String name;
    private HeroNode left;//默认null
    private HeroNode right;//默认null
    public HeroNode(int no, String name) {
    super();
    this.no = no;
    this.name = name;
    }
    public int getNo() {
    return no;
    }
    public void setNo(int no) {
    this.no = no;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    public HeroNode getLeft() {
    return left;
    }
    public void setLeft(HeroNode left) {
    this.left = left;
    }
    public HeroNode getRight() {
    return right;
    }
    public void setRight(HeroNode right) {
    this.right = right;
    }
    @Override
    public String toString() {
    return "HeroNode [no=" + no + ", name=" + name + "]";
    }
    /**
    * 前序遍历
    */
    public void preOrder() {
    //先输出当前节点
    System.out.println(this);
    //递归向左子树前序遍历
    if(this.left!=null) {
    this.left.preOrder();
    }
    //递归向右子树前序遍历
    if(this.right!=null) {
    this.right.preOrder();

    }
    }
    /**
    * 中序遍历
    */
    public void infixOrder() {
    //递归向左子树中序遍历
    if(this.left!=null) {
    this.left.infixOrder();
    }
    //输出当前节点
    System.out.println(this);
    //递归向右子树中序遍历
    if(this.right!=null) {
    this.right.infixOrder();
    }
    }
    /**
    * 后序遍历
    */
    public void postOrder() {
    //递归向左子树遍历
    if(this.left!=null) {
    this.left.postOrder();
    }
    //递归向右子树遍历
    if(this.right!=null) {
    this.right.postOrder();
    }
    //输出当前节点
    System.out.println(this);
    }
    }

  • 相关阅读:
    redis安装等其他操作
    jquery 图片缩放插件使用
    bootstrap 自定义模态窗口
    Linux下 mkdir 命令详解
    linux,chmod如何更改所有子目录的权限,要包括隐藏文件
    MFC中的句柄
    MFC——CDC
    CREATESTRUCT cs 结构体
    MFC函数—— CFrameWnd::OnCreateClient
    MFC函数——CWnd::OnEraseBkgnd
  • 原文地址:https://www.cnblogs.com/juddy/p/13812249.html
Copyright © 2011-2022 走看看