目录
概念:
二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分 。
特点:
-
每个结点只有两棵子树,分别为左子树和右子树;
-
二叉树的左右子树如果位置发生了改变,含义也会发生改变
常见的二叉树类型:
-
满二叉树:如果一棵二叉树只有度为0的节点和度为2的节点,并且度为0的节点在同一层上,则这棵二叉树为满二叉树 。
-
完全二叉树:深度为k,有n个节点的二叉树当且仅当其每一个节点都与深度为k的满二叉树中编号从1到n的节点一一对应时,称为完全二叉树。
结构:
class Node {
int value;
Node left; //左子树
Node right; //右子树
public Node (int value) {
this.value = value;
this.left = null;
this.right = null;
}
二叉树的遍历
1.先序遍历(根—左—右)
//preorder
public static void preorder (Node head) {
if (head == null) {
return;
}
System.out.print(head.value+" ");
preorder(head.left);
preorder(head.right);
}
2.中序遍历(左—根—右)
//inorder
public static void inorder (Node head) {
if (head == null) {
return;
}
inorder(head.left);
System.out.print(head.value+" ");
inorder(head.right);
}
3.后序遍历(左—右—根)
后序遍历是解决二叉树dp问题的常用手段,后面的文章会分享到。
//postorder
public static void postorder (Node head) {
if (head == null) {
return;
}
postorder(head.left);
postorder(head.right);
System.out.print(head.value+" ");
}
4.层序遍历
用队列实现二叉树的层序遍历。
//BFS Breadth Frist Search
public static void BFS (Node head) {
Queue<Node> queue = new LinkedList<>();
queue.add(head);
while (!queue.isEmpty()) {
Node cur = queue.poll();
if (cur.left!=null) {
queue.add(cur.left);
}
if (cur.right!=null) {
queue.add(cur.right);
}
System.out.print(cur.value+" ");
}
}
二叉树层序遍历求解最大宽度
在层序遍历的过程中,用curEnd记录当前层的最后节点,同时用nextEnd记录下一层的最后节点。当队列弹出节点与curEnd指向节点相同时,结束当前层的统计,将nextEnd给到curEnd,继续下一层的统计,直到队列中节点数为空。
//BFS Search max Breadth
public static int maxBreadth (Node head) {
int max = 0;
Queue<Node> queue = new LinkedList<>();
queue.add(head);
Node curEnd = head;
Node nextEnd = null;
int levelNodes = 0; //记录当前层节点个数
while(!queue.isEmpty()) {
Node cur = queue.poll();
if(cur.left != null) {
queue.add(cur.left);
nextEnd = cur.left;
}
if(cur.right != null) {
queue.add(cur.right);
nextEnd = cur.right;
}
levelNodes++;
if(cur == curEnd) {
max = Math.max(max,levelNodes);
curEnd = nextEnd;
levelNodes = 0;
}
}
return max;
}