安装排序算法应该是堆排序,但理解堆排序首先要理解堆,而理解堆便需要理解树。而树内容较多,是一种独特的数据结构,所以单开一片文章记录树。
树相比于链表,数组。
树,是非线性结构的典型例子,不再是一对一,而变成了一对多,即一个根节点有多个子节点。
如图所示
一些关于树的基本概念
1.图中的结构就像一棵倒过来的树,最顶部的节点A就是根节点 (root 节点),每棵树至多只有一个根节点。
2.根节点生出多个孩子节点,每个孩子节点只有一个父节点。
3.父子节点是相对的如图中D是B的孩子节点,D是G的父节点。
4.没有孩子节点的节点成为叶子节点 (leaf)。
5.具有相同父节点的节点互称为兄弟节点如图中D,E。
6.一个节点直接含有的子树个数,叫做节点的度。
7.棵树中最大节点的度,即哪个节点的子节点最多,它的度就是树的度。上图中树的度为 2 。
8.从根节点开始算起,根节点为第一层,往后底层。比如上图中,B的层次是 2,G的层次是 4。
9.树的高度是从叶子节点开始,自底向上增加。D的高度为2。
10.与高度相反,树的深度从根节点开始,自顶向下增加。D的深度为3。
实现一个简单的树
/*构造一颗树(链表实现)*/
public class Tree01 {
private Object mData; //存储的数据
private Tree01 mParent; //父亲节点的下标
private Tree01 mChild; //孩子节点的引用
public Tree01(Object data, Tree01 parent) {
mData = data;
mParent = parent;
}
//自动生成get,set方法。
public Object getmData() {
return mData;
}
public void setmData(Object mData) {
this.mData = mData;
}
public Tree01 getmParent() {
return mParent;
}
public void setmParent(Tree01 mParent) {
this.mParent = mParent;
}
public Tree01 getmChild() {
return mChild;
}
public void setmChild(Tree01 mChild) {
this.mChild = mChild;
}
}
比C语言实现简单的多吧,不用自己写指针…
二叉树:树的每个节点最多只能有两个子节点。
是一种非常重要的数据结构,它同时具有数组和链表各自的特点:*它可以像数组一样快速查找,也可以像链表一样快速添加。*但是他也有自己的缺点:删除操作复杂。
(1)树执行查找、删除、插入的时间复杂度都是O(logN)
(2)遍历二叉树的方法包括前序(DLR)、中序(LDR)、后序(LRD)
(3)非平衡树指的是根的左右两边的子节点的数量不一致
(4) 在非空二叉树中,第i层的结点总数不超过 , i>=1;
(5)深度为h的二叉树最多有个结点(h>=1),最少有h个结点;
(6)对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
创建二叉树
public class TreeNode02 {
private int val;
//左孩子
private TreeNode02 left;
//右孩子
private TreeNode02 right;
/*省略了get,set方法*/
}
求二叉树的最大深度
int maxDeath(TreeNode02 node){
if(node==null){//根节点为空直接返回0
return 0;
}
int left = maxDeath(node.left);//递归算左边路
int right = maxDeath(node.right);//递归算右边路
return Math.max(left,right) + 1;//取最大值
}
求二叉树中节点的个数
int numOfTreeNode(TreeNode02 root){
if(root == null){//根节点为空直接返回0
return 0;
}
int left = numOfTreeNode(root.left);
int right = numOfTreeNode(root.right);
return left + right + 1;//左右节点个数相加
}
求叶子节点个数
int numsOfNoChildNode(TreeNode02 root){
if(root == null){
return 0;
}
if(root.left==null&&root.right==null){//左右子节点都为空返回1
return 1;
}
//左叶子节点+右叶子节点
return numsOfNodeTreeNode(root.left)+numsOfNodeTreeNode(root.right);
}
判断二叉树是否是平衡二叉树
平衡二叉树是基于二分法的策略提高数据的查找速度的二叉树的数据结构;
特点:
(1)非叶子节点最多拥有两个子节点;
(2)非叶子节值大于左边子节点、小于右边子节点;
(3)树的左右两边的层级数相差不会大于1;
(4)没有值相等重复的节点;
更多关于平衡二叉树可以点击这里
boolean isBalanced(TreeNode node){
return maxDeath2(node)!=-1;
}
int maxDeath2(TreeNode02 node){
if(node == null){
return 0;
}
int left = maxDeath2(node.left);
int right = maxDeath2(node.right);
if(left==-1||right==-1||Math.abs(left-right)>1){
return -1;//左右节点层级相差
}
return Math.max(left, right) + 1;
}
参考:
https://www.cnblogs.com/SimonHu1993/p/7661671.html
https://www.jianshu.com/p/0190985635eb