首先我们先介绍一下与树相关的三个概念:高度,深度,层级。他们的定义是这样的:
节点的高度=节点到叶子节点的最长路径(即最大边数)
节点的深度=根节点到该节点所经过的最大边数
节点的层级=节点的深度+1
树的高度=根节点的高度
在理解记忆方面,我们高度可以比作为楼房的高度,只是从0开始的,深度可以理解为水的深度,以水平面为参照物,层级跟深度有一样的类比,只是他们的开始值不一样,深度是从0开始的,而层级是从1开始的。
接下来我们来讨论二叉树
二叉树中有俩种特殊的二叉树,分别为如图 2的满二叉树,如图3的完全二叉树。
想要存储一棵二叉树,我们有两种方法,一种是基于指针或者引用的链式存储法,一种是基于数组的顺序存储。基于链表的链式存储结构如下:
基于线性结构顺序存储的数据如下:
对于完全二叉树适合用顺序数组存储这样的方式进行存储,对于非完全二叉树使用这种存储方式,太浪费空间。在我们的jvm中,堆就是一个完全二叉树,最常用的存储方式就是数组。
二叉树的遍历:
二叉树的遍历分为:前序遍历,中序遍历跟后序遍历。其中,前,中,后序表示的是结点与它的左右子树节点遍历打印的先后顺序。
前序遍历是指,对于树中的任意节点来说,先打印他本身,再打印它的左子树,最后打印右子树。
中序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后打印它本身,最后打印它的右子树。
后序遍历是指,对于树中的任意节点来说,先打印它的左子树,然后打印它的右子树,最后打印它本身。
所谓的前,中,后其实都是以节点本身来说的,前序遍历,就是先打印它本身;中序遍历就是先左,然后就是它本身;后序遍历就是先左子树,再右子树,最后它本身。
实际上二叉树的前,中,后序遍历是一个递归的过程。写递归代码的关键,就是看能不能写出递归公式,而写出递归公式的关键就是,如果要解决问题A,就假设子问题B、C已经解决了,然后再来看如何利用B、C来解决A。所以我们可以把前,中,后遍历的递归公式先写出来。
preorder(r)=print(r)->preorder(r->left)->preorder(r->right)
inorder(r)=inorder(r->left)->inorder(r)->inorder(r->right)
postorder(r)=postorder(r->left)->postorder(r->right)->postorder(r)
代码实现如下:
public class BinarryTree<T> {
BinarryTree<T> left;
BinarryTree<T> right;
T data;
public BinarryTree(BinarryTree<T> left, BinarryTree<T> right, T data) {
this.left = left;
this.right = right;
this.data = data;
}
public BinarryTree() {
}
public BinarryTree<T> getLeft() {
return left;
}
public void setLeft(BinarryTree<T> left) {
this.left = left;
}
public BinarryTree<T> getRight() {
return right;
}
public void setRight(BinarryTree<T> right) {
this.right = right;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
//二叉树的前序比遍历
public void preOrder(BinarryTree root){
if (root !=null){
System.out.println(root.getData());
preOrder(root.getLeft());
preOrder(root.getRight());
}
}
//二叉树的中序遍历
public void inOrder(BinarryTree root){
if(root != null){
inOrder(root.getLeft());
System.out.println(root.getData());
inOrder(root.getRight());
}
}
//二叉树的后序遍历
public void postOrder(BinarryTree root){
if(root != null){
postOrder(root.getLeft());
postOrder(root.getRight());
System.out.println(root.getData());
}
}
}