看了形形色色的资料,要么都是C、C++的版本,对于初学java的人来说,有点难度,因此我花了几天时间总结了这篇文章,希望对大家有点用。
1.首先了解一些简单的二叉树知识:
1)二叉树是一种数据结构;"数据结构+算法=程序"的概念必须深深的印在脑海里,这也是我们为什么学习数据结构与算法的根本原因;了解数据结构才能在写出更好的程序;
这里放一张图来加深对二叉树的理解:
这幅图是随便找的,但我觉得可以给大家很好的体验,因为第一张图1是根节点,是23的父节点,而23之间湖成为堂兄弟;45是2的孩子,45之间是兄弟关系,6是3的孩子,6和45互为堂兄弟关系,这个跟我们日常生活相差无几,理解即可。
第二幅图:除父节点之外都是单节点,也就是说父节点1有两个子节点2 3,而2只有一个右节点(或者成为右孩子rightchild),4只有一个左节点(也就是左孩子leftchild),35关系同上。
两幅图中,456 65分别是终结点,也就是树的叶子,所以又叫叶节点
2)二叉树的基本单元是结点(包括存储的数据和左右子树的存储地址)
3)二叉树的一些名称:自平衡二叉树\红黑树\完全二叉树\满二叉树…
4)二叉树的遍历方法:(四种)
前序遍历
中序遍历
后序遍历
层序遍历
5)由中序遍历和其他任意一种遍历可以唯一确定一颗二叉树(原因是在当只有一个子节点存在时,前后序只能确定父子关系,而不能确定左右根之间的关系,可以自己画图理解,这里不再赘述)
6)代码实现:
1.首先简单的说明一下,在IDEA工具箱中,先创建一个包package:com.huster.chapter5tree.TreeTry(这个可以大家自行搞定,如果想要直接复制我的代码,需要进行本步骤)
2.本代码说明:分为两大类 a)创建二叉树的基本单元TreeNode并封装,提供插入数据和前中后序遍历的静态方法 b)测试类Test ,将{63 45 77 66 86 62 42 48}插入二叉树,并进行三种遍历方式
3.直接上代码!
先上一个TreeNode类
package com.huster.chapter5Tree.TreeTry;
public class TreeNode {
//属性私有化 父节点\左节点\右节点\存储的数据
private TreeNode leftchild;
private TreeNode rightchild;
private TreeNode rootnode;
private int data;
//构造器
public TreeNode(TreeNode leftchild, TreeNode rightchild, int data) {
this.leftchild = leftchild;
this.rightchild = rightchild;
this.data = data;
}
public TreeNode(int data) {
this.data = data;
this.leftchild = null;
this.rightchild = null;
}
public TreeNode() {
}
//setter and getter
public TreeNode getLeftchild() {
return leftchild;
}
public TreeNode getRightchild() {
return rightchild;
}
public TreeNode getPrerant() {
return rootnode;
}
public int getData() {
return data;
}
public void setLeftchild(TreeNode leftchild) {
this.leftchild = leftchild;
}
public void setRightchild(TreeNode rightchild) {
this.rightchild = rightchild;
}
public void setPrerant(TreeNode prerant) {
this.rootnode = prerant;
}
public void setData(int data) {
this.data = data;
}
//插入数据
public static TreeNode insert(TreeNode rootnode, int value) {
if (value<rootnode.getData()){
if (null==rootnode.getLeftchild()){
TreeNode temp=new TreeNode(value);
temp.setPrerant(rootnode);
rootnode.setLeftchild(temp);
return temp;
}else return insert(rootnode.getLeftchild(),value);
}else{
if (null==rootnode.getRightchild()){
TreeNode temp=new TreeNode(value);
temp.setPrerant(rootnode);
rootnode.setRightchild(temp);
return temp;
}else return insert(rootnode.getRightchild(),value);
}
}
//前序遍历
public static void preOrd(TreeNode treeNode){
if(null==treeNode){
return;
}
System.out.print(treeNode.data+" ");
preOrd(treeNode.leftchild);
preOrd(treeNode.rightchild);
}
//中序遍历
public static void inOrd(TreeNode treeNode){
if (treeNode==null){
return;
}
inOrd(treeNode.leftchild);
System.out.print(treeNode.data+" ");
inOrd(treeNode.rightchild);
}
//后序遍历
public static void postOrd(TreeNode treeNode){
if (null==treeNode){
return;
}
postOrd(treeNode.leftchild);
postOrd(treeNode.rightchild);
System.out.print(treeNode.data+" ");
}
//层序遍历
public static void levelOrd(TreeNode rootnode) {
if (rootnode == null)
return;
LinkedList<TreeNode> lists= new LinkedList<>();//Queen<TreeNode> queen=new LinkedBlockingQueen<>();
TreeNode curr;
lists.add(rootnode);
while (!lists.isEmpty()) {
curr = lists.pop();//查API文档,此处也可以用LinkedBlockingQueen的poll()方法或者直接用LinkedList的pop()方法
System.out.print(curr.getData()+ " ");
if (curr.leftchild != null)
lists.add(curr.leftchild);
if (curr.rightchild != null)
lists.add(curr.rightchild);
}
}
@Override
public String toString() {
return "TreeNode{" +
"data=" + data +
'}';
}
}
然后是测试类Test`
package com.huster.chapter5Tree.TreeTry;
public class Test {
public static void main(String[] args) {
TreeNode rootnode=new TreeNode(63);
TreeNode.insert(rootnode,45);
TreeNode.insert(rootnode,77);
TreeNode.insert(rootnode,66);
TreeNode.insert(rootnode,86);
TreeNode.insert(rootnode,62);
TreeNode.insert(rootnode,42);
TreeNode.insert(rootnode,48);
System.out.print("前序遍历的结果:");
TreeNode.preOrd(rootnode);
System.out.println();
System.out.print("中序遍历的结果:");
TreeNode.inOrd(rootnode);
System.out.println();
System.out.print("后序遍历的结果:");
TreeNode.postOrd(rootnode);
}
}
以上就是全部过程,基本知识点和代码结合理解。如果大家有任何问题,可以在评论区留言。