本来说复习一下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 左右都有

 遍历

  先序遍历:根左右

  中序遍历:左根右

  后序遍历:左右根

  

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

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

 1 package tree;
 2
 3 import java.util.LinkedList;
 4 import java.util.List;
 5
 6 public class Tree {
 7
 8     private static class Node{
 9         Node left;
10         Node right;
11         int val;
12
13         Node(int data){
14             left = null;
15             right = null;
16             val = data;
17         }
18     }
19
20     //生成一颗二叉树
21     public static List<Node> CreatTree(int[] array){
22
23         List<Node> nodelist = new LinkedList<>();
24         //每个位置转换成节点
25         for(int i = 0; i<array.length; i++){
26             nodelist.add(new Node(array[i]));
27         }
28         //按照关系建立二叉树
29         for(int i=0; i<array.length/2-1; i++){
30             //左孩子
31             nodelist.get(i).left = nodelist.get(i*2+1);
32             //右孩子
33             nodelist.get(i).right = nodelist.get(i*2+2);
34         }
35         //最后一个节点特殊处理
36         int index = array.length / 2 - 1;
37         //左孩子
38         nodelist.get(index).left = nodelist.get(index*2+1);
39         //如果长度是奇数,那就有右孩子
40         if(array.length%2 == 1){
41             nodelist.get(index).right = nodelist.get(index*2+2);
42         }
43
44         return nodelist;
45     }
46
47     //先序遍历(根、左、右)
48     public static void preOrderTraverse(Node node){
49         if(node == null) return;
50         //根
51         System.out.print(node.val + " ");
52         //左
53         preOrderTraverse(node.left);
54         //右
55         preOrderTraverse(node.right);
56     }
57
58     //中序遍历
59     public static void inOrderTraverse(Node node){
60         if(node == null) return;
61         //左
62         inOrderTraverse(node.left);
63         //根
64         System.out.print(node.val + " ");
65         //右
66         inOrderTraverse(node.right);
67     }
68
69     //后序遍历
70     public static void postOrderTraverse(Node node){
71         if(node == null) return;
72         //左
73         postOrderTraverse(node.left);
74         //右
75         postOrderTraverse(node.right);
76         //根
77         System.out.print(node.val + " ");
78     }
79
80
81     public static void main(String[] args) {
82         int[] array = { 1, 2, 3, 4, 5, 6, 7, 8 };
83         //获取根节点
84         Node root = Tree.CreatTree(array).get(0);
85
86         System.out.println("先序遍历:");
87         preOrderTraverse(root);
88         System.out.println();
89
90         System.out.println("中序遍历:");
91         inOrderTraverse(root);
92         System.out.println();
93
94         System.out.println("后序遍历:");
95         postOrderTraverse(root);
96         System.out.println();
97     }
98
99 }

运行结果:

转载于:https://www.cnblogs.com/ccxka/p/9600520.html

java 二叉树的创建 遍历相关推荐

  1. java二叉树的创建,遍历及其他方法

    2019独角兽企业重金招聘Python工程师标准>>> package tree;import java.util.Stack;/**二叉树**/ public class Bina ...

  2. Java 二叉树后序遍历(递归/非递归)

    Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...

  3. Java 二叉树中序遍历(递归/非递归)

    Java 二叉树中序遍历(递归/非递归) 中序遍历 代码实现 递归方式 非递归方式 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访 ...

  4. java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

    1 packageSolution;2 3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6 7 ...

  5. Java二叉树后序遍历:递归与迭代

    二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树:左子树和右子树又同样都是二叉树. 如下便是一棵二叉树: 二叉树的后序遍历方式为: 1. 如果根节点有左 ...

  6. Java二叉树逆序遍历_二叉树遍历小结

    二叉树遍历小结 声明 0 二叉树遍历概述 二叉树遍历:按照既定序,对每个节点仅访问一次: 二叉树非递归遍历思想:参考这篇博文,核心思想是存在重合元素的局部有序保证整体有序,由于二叉树的结构特点,二叉树 ...

  7. java 二叉树的各种遍历

    先序中序后序,递归与非递归,默认构造的排序二叉树 package Tree;import java.util.Stack;public class BinaryTree {class Node{int ...

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

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

  9. 《Java版本二叉树的创建和前序中序后序层次遍历》--递归版本

    目录 1.二叉树的递归创建(少说废话,直接上code) 2.二叉树的前序遍历.中序遍历.后续遍历 3.最后贴出所有代码 效果图 1.二叉树的递归创建(少说废话,直接上code) //前序遍历的创建二叉 ...

  10. Java创建遍历二叉树(递归)并求树高及叶节点个数(代码全)

    在学习树的操作之后,我们就可以对数这种数据结构进行创建和使用了,话不多说,直接上代码 PS:为了代码复用和通用性,采用接口然后打包了整个工程,存储数据定义为泛型 一.接口及链结点定义 package ...

最新文章

  1. AI颠覆经济世界作用被夸大?影响远比媒体头条报道更加复杂
  2. 数值和字符串互相转换
  3. tomcat部署web應用時涉及到的基本概念
  4. 计算机组装维修期末考试题,2014计算机组装维修期末考试题(1)
  5. 五子棋项目结束总结_居家活动系列总结
  6. android中activity布局,Activity布局初步(一)
  7. BZOJ 2818GCD
  8. requests请求报字符编码异常信息
  9. C#多线程学习(五) 多线程的自动管理(定时器)
  10. android 自定义view 水波纹进度球
  11. oracle11g数据库登录01017,【数据库管理】ORA-01017错误及部分的常见典型案例-Go语言中文社区...
  12. 印象笔记导入html笔记,Evernote Importer|印象笔记导入
  13. linux常用的英文单词收集
  14. 「建模学习」3DsMAX贴图制作方法,足球贴图案例详细教程
  15. Photoshop CS6版本安装及破解教程
  16. 设计模式简介 - Introduction to Design Patterns
  17. 孩子被人欺负了,要不要打回去?非常赞同这位宝妈的做法
  18. 《HelloGitHub》第 74 期
  19. 检测PE文件的有效性
  20. 智能机器人编程有必要学吗?

热门文章

  1. 如何有逻辑的,简单清晰的回应问题
  2. R语言中文社区世界读书日图书推荐(含赠书活动)
  3. C#原子性运算 interlocked.compareExchanged
  4. android - Unable to add window -- token null is not for an application的解决方案
  5. java.lang.ClassNotFoundException: org.springframework.web.util.WebAppRootListener
  6. 解决 git branch -a 无法全部显示远程的分支,只显示master分支
  7. php之简单的文件管理(基本功能
  8. 深入理解Azure自动扩展集VMSS(3)
  9. ife task0003学习笔记(三):JavaScript闭包
  10. 【Java中的网络编程】