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),以菜单方式设计并完成功能任务:建立并存储树.输出前序遍历结果.输出中序遍历结果.输出后序遍历结果.交换左右子树.统计高度,其中对于 ...
随机推荐
- ASP.NET SignalR 与 LayIM2.0 配合轻松实现Web聊天室 实战系列(内容已过期,阅读请慎重)
项目简介 利用ASP.NET SignalR技术与Layim前端im框架实现的一个简单的web聊天室,包括单聊,群聊,加好友,加群,好友搜索,管理,群组管理,好友权限设置等功能.涉及技术: Elast ...
- select下拉框之默认选项清空
最近和小伙伴发现,select默认选项一般是提示信息,怎么才能让当我们点击下拉框时,可选的选项中没有默认的提示信息呢? 思路: 1.当点击下拉框时,让默认提示信息,即下拉框第一个选项移除. 2.当没有 ...
- 由.def文件生成lib文件[转]
最近在学习curl库时,碰到一个问题,从官网上下载了一个lib版的,却发现只有.dll,没有lib文件,感觉很奇怪,google了之后才知道,原来库作者的用意是让用户自己生成lib文件,下载到的lib ...
- 删除oracle实例
1.在开始菜单中,点击ORAHOME目录下的"Configuration and Migration Tools"下的"Database Configuration As ...
- java中构造器的调用顺序
在编程的过程中,我们经常会遇到多个类的继承问题,那么多个类的构造器是按照什么顺序调用的呢? 先看一段代码: public class Meal { public Meal() { System.out ...
- HDU 2018母牛的故事(类似斐波那契,找规律)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2018 母牛的故事 Time Limit: 2000/1000 MS (Java/Others) ...
- TCP Congestion Control
TCP Congestion Control Congestion occurs when total arrival rate from all packet flows exceeds R ove ...
- Gradle Goodness: Unpacking an Archive
To create an archive with Gradle is easy. We have several tasks like Zip, Tar, Jar, War and Ear to c ...
- Office365学习笔记—列表查询,删除条目,更新条目。
1,基于Query语句的列表查询. function retrieveListItems(itemId) { var siteUrl=_spPageContextInfo.webServerRelat ...
- ObjC之RunTime(上)
转载自这里. 最近看了一本书——iOS6 programming Pushing the Limits(亚马逊有中文版),最后一章是关于Deep ObjC的,主要内容是ObjC的runtime.虽然之 ...