二叉树:看完尚硅谷的数据结构与算法有感而发也当为自己做笔记,以后会陆续更新数据结构和算法
1.树结构的特性
2.二叉树的类型
3.二叉树前序遍历
4.二叉树中序遍历
5.二叉树后序遍历
首先讲一下我理解的树结构的特点
有树的深度,根结点,结点,子节点和叶子节点。 根节点呢就是第一个结点,树的深度呢就是这棵树有多少层,
根节点是树的第一个结点,结点是树的每一个元素都是一个结点,子节点是有父节点的节点,叶子节点是左右两只手都没有结点的结点是子节点。这里可能介绍的不太详细,还望指点。
二叉树的特别类型分为满二叉树和完全二叉树
满二叉树:所有叶子节点都在倒数第一层而且最后一层从左到右必须都是连续的在同一层的。
完全二叉树:所有叶子节点都在倒数第一层或者倒数第二层从左到右连续并且从右到左也是连续的可以不再同一层
二叉树的前序遍历`public class HeroNode {
private int no;
private String name;
private HeroNode left;
private HeroNode right;
public HeroNode(int no, String name) {
this.no = no;
this.name = name;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public HeroNode getLeft() {
return left;
}
public void setLeft(HeroNode left) {
this.left = left;
}
public HeroNode getRight() {
return right;
}
public void setRight(HeroNode right) {
this.right = right;
}
@Override
public String toString() {
return "HeroNode{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
//前序遍历
public void preOrder(){
System.out.println(this);
if (this.left != null){
this.left.preOrder();
}
if (this.right != null){
this.right.preOrder();
}
}`
}
public class Tree {
private HeroNode root;
public void setRoot(HeroNode root) {
this.root = root;
}
//前序遍历
public void preOrder() {
if (this.root != null) {//如果不为空进行递归遍历
this.root.preOrder();//调用实体类里面前序递归遍历的方法
} else {
System.out.println("二叉树为空无法遍历");
}
}
}
首先我们创建两个类 一个实体类一个树类
前序遍历首先呢就是找根节点如果根节点不为空那么我们就输出根结点,如果为空那就提示一句话
System.out.println(“二叉树为空无法遍历”);否则我们进行递归遍历,首先输出根结点,然后判断根结点左边是否为空,不为空的话向左递归遍历,如果为空就找右边结点是否为空,如果右边结点不为空则向右递归遍历。例如
如果二叉树为上图那么前序遍历的结果应该是先找根节点宋江输出1,然后找左结点输出2,继续找左节点是否有子节点,那么通过图片我们显然可以得到的是根节点左节点是没有子节点的。所以,我们找根节点的右结点输出3,继续找右节点是否有子节点,我们发现它是有子节点的,所以我们输出4然后再继续找4是否有子节点我们发现没有方法执行完成,所以输出1,2,3,4。
如果说我们给3号卢俊左边加一个结点为5
那么按照上图我们经过分析不难得出,当我们遍历到3号卢俊义的时候前序遍历会优先遍历左子节点5关胜,然后再遍历右子节点林冲。所以我们前序遍历得到的结果是1,2,3,5,4。
中序遍历
中序遍历的话实体类里面我就直接把中序遍历代码粘贴过来
//下面为实体类里面的代码块
//中序遍历
public void initOrder(){
if (this.left != null){
this.left.initOrder();
}
System.out.println(this);
if (this.right != null){
this.right.initOrder();
}
}
//下面为树里面的代码块
//中序遍历
public void initOrder() {
if (this.root != null) {
this.root.initOrder();
} else {
System.out.println("二叉树为空无法遍历");
}
}
首先我们还是先判断根节点是否为空。如果不为空我们调用中序递归遍历方法中序遍历方法呢其实我觉得可以根据前中后三个字就得出在哪里输出根结点。首先我们判断根结点左子节点是否为空,如果不为空我们就输出左子节点并继续向左子节点遍历直到左子节点为空我们再输出根结点然后我们向根结点的右边开始递归中序遍历。所以根据第一张图我们首先找的是1结点左子节点是否为空,不为空因为是2结点,然后我们再判断2左子节点是否为空。我们发现2结点左子节点为空,所以我们输出2结点,我们再继续判断2结点右子节点是否为空。我们看到2的右子节点为空所以我们返回上一层1结点输出1结点再判断1结点的右子节点发现1结点右子节点不为空是3结点,我们继续找3结点的左子节点是否为空,我们发现为空所以输出3结点再判断3结点的右子节点是否为空。3结点右结点为4结点,所以我们输出4结点。所以中序遍历结果应该是2,1,3,4。
后序遍历
废话不啰嗦先上代码
//下面为实体类里面后序遍历代码
//后序遍历
public void postOrder(){
if (this.left != null){
this.left.postOrder();
}
if (this.right != null){
this.right.postOrder();
}
System.out.println(this);
}
//下面为树结构里面的后序遍历代码
//后序遍历
public void postOrder() {
if (this.root != null) {
this.root.postOrder();
} else {
System.out.println("二叉树为空无法遍历");
}
}
从代码里面我们可以看出后序遍历先判断根节点左边是否为空,不为空输出左子节点,然后判断根节点右子节点是否为空,不为空输出右子节点,最后输出根结点。所以这边我写的简洁点就是先判断1左子节点是否为空,因为不为空所以输出2结点然后判断1右边是否为空不为空因为是3结点再判断3结点左子节点是否为空,为空,所以判断3结点的右子节点是否为空,不为空所以输出4结点然后输出3结点最后输出1结点,所以输出的顺序为2,4,3,1。
上面可能包含了我个人的一些想法。我所写都是我自己用大白话讲得希望各位都能听得明白,最后数据结构确实有点搞脑子。今天先写一部分,下一次讲解前中后序遍历查找。
如上述有所错误希望各位能点出,谢谢各位。