java 二叉树的创建 遍历
本来说复习一下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 二叉树的创建 遍历的更多相关文章
- C语言实现二叉树的创建&遍历
算法思想(重点是递归的使用) 利用扩展先序遍历序列创建二叉链表 采用类似先序遍历的递归算法,首先读入当前根结点的数据,如果是'.'则将当前 树根置为空,否则申请一个新结点,存入当前根结点的数据,分别 ...
- JAVA二叉树的创建以及各种功能的实现
直接上代码了,代码说得很清楚了 package BTree; public class BTree { private Node root; private class Node { private ...
- 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历
根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...
- Java实现二叉树的创建和遍历操作(有更新)
博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
- java编写二叉树以及前序遍历、中序遍历和后序遍历 .
/** * 实现二叉树的创建.前序遍历.中序遍历和后序遍历 **/ package DataStructure; /** * Copyright 2014 by Ruiqin Sun * All ri ...
- 二叉树 - 建立与遍历使用Java
二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根 ...
- c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
二叉树的创建与遍历(非递归遍历左右中,破坏树结构) 创建 二叉树的递归3种遍历方式: 1,先中心,再左树,再右树 2,先左树,再中心,再右树 3,先左树,再右树,再中心 二叉树的非递归4种遍历方式: ...
- 二叉树的创建、遍历(递归和非递归实现)、交换左右子数、求高度(c++实现)
要求:以左右孩子表示法实现链式方式存储的二叉树(lson—rson),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...
随机推荐
- _bstr_t可接受多字节、UNICODE字符串,方便用以字符集转换
使用_bstr_t需要包含的头文件: #include <comutil.h> #include <comdef.h> // test.cpp : 定义控制台应用程序的入口点. ...
- 轻松排查线上Node内存泄漏问题
I. 三种比较典型的内存泄漏 一. 闭包引用导致的泄漏 这段代码已经在很多讲解内存泄漏的地方引用了,非常经典,所以拿出来作为第一个例子,以下是泄漏代码: 'use strict'; const exp ...
- IDEA定位开发文件在左边工程中的文件路径
IDEA新公司入职使用第七天,基本快捷键和BUG调试已经搞透了!从最开始的配置到现在的适应确实是一个不小的进步,前几天每天加班太忙没有时间更新博客,明天就是五一假期,现在将刚掌握的一点IDEA技术写出 ...
- vue+elementUI封装的时间插件(有起始时间不能大于结束时间的验证)
vue+elementUI封装的时间插件(有起始时间不能大于结束时间的验证): html: <el-form-item label="活动时间" required> & ...
- centos7生成密钥及集群之间免密登录
1.在本地生成密钥 命令:ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa 2.进入.ssh文件夹,创建保存密钥的文件 命令:touch authorized_keys ...
- 配置RedisTemplate、JedisPoolConfig、JedisConnectionFactory+自定义序列化 (xml+java方式)+使用
java方式配置RedisTemplate //spring注入ben //@Bean(name = "redisTemplate") public RedisTemplate i ...
- 集合异常之Set接口
Set接口,它里面的集合,所存储的元素就是不重复的,通过元素的equals方法,来判断是否为重复元素. HashSet存储JavaAPI中的类型元素 给HashSet中存储JavaAPI中提供的类型元 ...
- ORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listener
执行$ORACLE_HOME/bin/dbstart 启动数据库提示如下: [oracle@prim bin]$ ./dbstart ORACLE_HOME_LISTNER is not SET, u ...
- Oracle 体系结构二 内存结构
Oracle实例由共享内存块(SGA)以及大量的后台进程构成. SGA必须包含的数据结构: 数据库缓冲区缓存 日志缓冲区 共享池 可选的数据结构: 大池 JAVA池 流池 其他缓冲区缓存池 用户会话还 ...
- ASP.NET Core获取微信订单数据
前几天对接了一波微信的订单,分享出来 1.生成签名 根据微信要求把appid.商户号.随机数.和订单号还有商户平台的密钥拼接成一个字符串然后进行MD5加密 2.拼接请求XML 然后用拼接好的XML向微 ...