一、树的基本概念
1. 树的定义与特点
- 树是一种非线性结构 ,每个节点能延伸出多个子节点,每个子节点只有一个父节点。如文件目录结构,“此电脑”是根节点,磁盘分区、文件夹是子节点 。
- 介绍了节点的度(一个节点含子树的个数 )、树的度(树中节点度的最大值 )、叶子节点(度为0的节点 )、双亲节点、孩子节点等概念。
2. 树的表示形式
- 提到双亲和孩子表示法等多种表示方式,重点讲解孩子表示法,用类表示节点,包含节点值和子节点列表 。
二、二叉树相关
1. 二叉树的存储
采用孩子表示法,节点类包含值、左子节点和右子节点 。构建二叉树示例代码:
class Node {
String val;
Node left;
Node right;
Node(String val) {
this.val = val;
}
}
public static Node createTree() {
Node a = new Node("A");
Node b = new Node("B");
Node c = new Node("C");
Node d = new Node("D");
Node e = new Node("E");
Node f = new Node("F");
Node g = new Node("G");
a.left = b;
a.right = c;
b.left = d;
b.right = e;
c.right = f;
e.left = g;
return a;
}
2. 二叉树的遍历
- 先序遍历
- 顺序:先访问根节点,再递归遍历左子树,最后递归遍历右子树 。
- 代码:
public static void preOrder(Node root) {
if (root == null) {
return;
}
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
- 中序遍历
- 顺序:先递归遍历左子树,再访问根节点,最后递归遍历右子树 。
- 代码:
public static void inOrder(Node root) {
if (root == null) {
return;
}
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
- 后序遍历
- 顺序:先递归遍历左子树,再递归遍历右子树,最后访问根节点 。
- 代码:
public static void postOrder(Node root) {
if (root == null) {
return;
}
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val + " ");
}
- 层序遍历
- 顺序:按层从左到右访问节点 。
- 实现方式:借助队列,先将根节点入队,然后循环取出队首元素,访问其值,并将其左右子节点入队(若存在 ) 。
- 代码:
public static void levelOrder(Node root) {
if (root == null) {
return;
}
Queue<Node> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
Node cur = queue.poll();
System.out.print(cur.val + " ");
if (cur.left != null) {
queue.offer(cur.left);
}
if (cur.right != null) {
queue.offer(cur.right);
}
}
}
3. 完全二叉树
- 规则:进行层序遍历时,第一阶段每个访问节点应有两个子树,遇到无子树或只有左子树节点进入第二阶段;第二阶段每个节点必须无子树,否则不是完全二叉树 。
- 判定及相关特性:先序遍历第一个元素是根节点,后序遍历最后一个元素是根节点;还原二叉树至少需两个序列且包含中序结果 。