学习总结-来自《极客时间-数据结构与算法》
概念
每个数据节点最多只有两个相关子节点。
二叉树的几个因素
- 高度:该节点到叶子节点经历的最长边数(从下到上)
- 深度:根节点到该节点所经历的边数(从上到下)
- 层数:节点的深度+1
- 树的高度=根的高度
类型
- 满二叉树:每个节点正好都有两个子节点
- 完全二叉树:除了最后一层,其他层的节点个数都要达到最大。并且最后一层的子节点都靠左
- 二叉查找树
在普通二叉树的结构上,满足一下数据存储的要求:
在树中的任意一个节点位置,其左子树每个节点的值都要小于该节点。其右子树每个节点的值都要大于该节点
实现方式
树的实现方法有两种(1)链表(2)数组
- 链表:每个链表节点有data,还有两个代表左右节点
- 数组:
遍历方式
- 前序遍历代码
//前序遍历:本身,左,右
public static void preOrder(BinaryTreeNode node) {
if(node == null) {
return;
}
System.out.print(node.data+",");
preOrder(node.left);
preOrder(node.right);
}
- 中序遍历代码
//中序遍历:左,本身,右
public static void MiddleOrder(BinaryTreeNode node) {
if(node == null) {
return ;
}
MiddleOrder(node.left);
System.out.print(node.data+",");
MiddleOrder(node.right);
}
- 后序遍历代码
//后序遍历:右,左,本身
public static void AfterOrder(BinaryTreeNode node) {
if(node == null) {
return ;
}
AfterOrder(node.right);
AfterOrder(node.left);
System.out.print(node.data+",");
}
- 按层遍历代码
//按层遍历
public static void levelOrder(BinaryTreeNode node) {
if(node == null) {
return;
}
LinkedList<BinaryTreeNode> queue = new LinkedList<BinaryTreeNode>();
queue.offer(node);
while(!queue.isEmpty()) {
BinaryTreeNode treeNode = queue.pop();
if(treeNode!=null) {
System.out.print(treeNode.data+",");
queue.offer(treeNode.left);
queue.offer(treeNode.right);
}
}
}