本来说复习一下BFS和DFS,辗转就来到了二叉树...本文包括二叉树的创建和遍历

概念

  数据:1 2 3 4 5 6 7生成一颗二叉树

上面的数是数据,不是位置,要区别一下数据和位置

红色的代表位置,黑色的代表数据,数据是通过数组给的

看红色的标记,每一个父节点的左儿子是 当前值*2+1 右儿子是 当前值*2+2,我们是从0开始编号的,如果是-1开始编号,则为x*2 、x*2+1

有了上面这个公式就会变得很简单,既然要生成一颗数,那么每个节点是必不可少的,就要定义一个节点类,里面包含当前值,左右儿子,左右儿子一个个往下指,就形成了 一棵树

在生成二叉树的时候,考虑到最后一个节点,上图数组的长度是8,此时没有右节点,如果为9,就有右节点

得到结果:length%2 == 0 只有左节点 length%2 == 1 左右都有

 遍历

  先序遍历:根左右

  中序遍历:左根右

  后序遍历:左右根

  

  有一个很简单的记忆方法,先中后代表根的位置,左右相对位置永远不变

  在程序里采用递归的方式进行实现

 package tree;

 import java.util.LinkedList;
import java.util.List; public class Tree { private static class Node{
Node left;
Node right;
int val; Node(int data){
left = null;
right = null;
val = data;
}
} //生成一颗二叉树
public static List<Node> CreatTree(int[] array){ List<Node> nodelist = new LinkedList<>();
//每个位置转换成节点
for(int i = 0; i<array.length; i++){
nodelist.add(new Node(array[i]));
}
//按照关系建立二叉树
for(int i=0; i<array.length/2-1; i++){
//左孩子
nodelist.get(i).left = nodelist.get(i*2+1);
//右孩子
nodelist.get(i).right = nodelist.get(i*2+2);
}
//最后一个节点特殊处理
int index = array.length / 2 - 1;
//左孩子
nodelist.get(index).left = nodelist.get(index*2+1);
//如果长度是奇数,那就有右孩子
if(array.length%2 == 1){
nodelist.get(index).right = nodelist.get(index*2+2);
} return nodelist;
} //先序遍历(根、左、右)
public static void preOrderTraverse(Node node){
if(node == null) return;
//根
System.out.print(node.val + " ");
//左
preOrderTraverse(node.left);
//右
preOrderTraverse(node.right);
} //中序遍历
public static void inOrderTraverse(Node node){
if(node == null) return;
//左
inOrderTraverse(node.left);
//根
System.out.print(node.val + " ");
//右
inOrderTraverse(node.right);
} //后序遍历
public static void postOrderTraverse(Node node){
if(node == null) return;
//左
postOrderTraverse(node.left);
//右
postOrderTraverse(node.right);
//根
System.out.print(node.val + " ");
} public static void main(String[] args) {
int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
//获取根节点
Node root = Tree.CreatTree(array).get(0); System.out.println("先序遍历:");
preOrderTraverse(root);
System.out.println(); System.out.println("中序遍历:");
inOrderTraverse(root);
System.out.println(); System.out.println("后序遍历:");
postOrderTraverse(root);
System.out.println();
} }

运行结果:

java 二叉树的创建 遍历的更多相关文章

  1. C语言实现二叉树的创建&遍历

    算法思想(重点是递归的使用)  利用扩展先序遍历序列创建二叉链表 采用类似先序遍历的递归算法,首先读入当前根结点的数据,如果是'.'则将当前 树根置为空,否则申请一个新结点,存入当前根结点的数据,分别 ...

  2. JAVA二叉树的创建以及各种功能的实现

    直接上代码了,代码说得很清楚了 package BTree; public class BTree { private Node root; private class Node { private ...

  3. 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历

    根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...

  4. Java实现二叉树的创建和遍历操作(有更新)

    博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...

  5. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  6. java编写二叉树以及前序遍历、中序遍历和后序遍历 .

    /** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...

  7. 二叉树 - 建立与遍历使用Java

    二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根 ...

  8. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)

    二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...

  9. 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)

    要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...

随机推荐

  1. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

  2. 16、SpringBoot-CRUD错误处理机制(3)

    3).将自己指定的数据携带出去 出现错误以后,会来到/error请求,会被BasicErrorController 进行处理 响应出去的数据是由 getErrorAttributes 得到的( Abs ...

  3. 关于Ftp服务器

    步骤/方法 首先在本地机器上创建一个用户!这些用户是用来登录到FTP的!我的电脑右键->管理->本地用户和组->用户->“右键”新建用户->输入用户名和密码再点创建就行了 ...

  4. 使用libcurl下载文件小例

    libcurl是一个很强大的开源网络处理库,支持包括HTTP.HTTPS.FTP……一系列网络协议.用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要 ...

  5. 二十二、详述 IntelliJ IDEA 中恢复代码的方法

    在咱们正常开发项目的时候,难免遇到在开发过程中由于某种原因,想要将代码恢复到前一版本的情景.特别是在咱们删除了某些代码,想要恢复之前删除的代码的时候,了解这个在 IntelliJ IDEA 中恢复代码 ...

  6. 【MongoDB】CentOS上安装MongoDB

    权限部分尚未测试完成,请勿参考. 1.去官方网站下载Mongodb for linux的包,我没找到CentOS的,随便下载了个mongodb-linux-x86_64-amazon-3.2.0.tg ...

  7. Oracle创建序列,Oracle创建序列语法

    -- Oracle创建序列 Create sequence CREATE SEQUENCE SEQ_SINGER -- 序列名称  START WITH 2 -- 开始数字  MAXVALUE 999 ...

  8. trunc(sysdate)的含义是什么

    1.ORACLE中TRUNC是截取的函数

  9. hibernate-笔记

    什么是 hibernate 框架 1.hibernate 框架应用在 javaee 三次结构中 dao 层框架 2.在dao 层里面对数据库做curd 操作, 使用hibernate 做crud 操作 ...

  10. 微信小程序中的app文件介绍

    [app] 一.app.json 1.对当前小程序的全局配置 2.页面路径.界面表现.网络超时时间.底部 tab 等 { "pages":[ "pages/index/i ...