

树是一种非线性的数据结构,由n(n>0)个有限节点组成一个具有层次关系的集合。它看起来像一棵倒挂的树,根朝上而叶朝下。
关键特点:
重要术语:
最常用的表示方法是孩子兄弟表示法:
class Node {
int value; // 树中存储的数据
Node firstChild; // 第一个孩子引用
Node nextBrother; // 下一个兄弟引用
}
二叉树是结点的一个有限集合,该集合:
特点:


// 孩子表示法
class Node {
int val; // 数据域
Node left; // 左孩子引用,常常代表左孩⼦为根的整棵左⼦树
Node right; // 右孩子引用,常常代表右孩⼦为根的整棵右⼦树
}
// 孩子双亲表示法
class Node {
int val;
Node left; // 左孩子引用,常常代表左孩⼦为根的整棵左⼦树
Node right; // 右孩子引用,常常代表右孩⼦为根的整棵右⼦树
Node parent; // 当前节点的根节点
}遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做⼀次且仅做⼀次访问。访问结点所做的操作依赖于具体的应⽤问题(比如:打印节点内容、节点内容加1)。遍历是⼆叉树上最重要的操作之一,是二叉树上进行其它运算之基础。


// 前序遍历
void preOrder(Node root) {
if (root == null) return;
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
// 中序遍历
void inOrder(Node root) {
if (root == null) return;
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
// 后序遍历
void postOrder(Node root) {
if (root == null) return;
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val + " ");
}从根节点出发,按层次从上到下、从左到右访问结点。
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);
}
}代码示例:
// 获取节点个数
int size(Node root) {
if (root == null) return 0;
return 1 + size(root.left) + size(root.right);
}
// 获取叶子节点个数
int getLeafNodeCount(Node root) {
if (root == null) return 0;
if (root.left == null && root.right == null) return 1;
return getLeafNodeCount(root.left) + getLeafNodeCount(root.right);
}
// 获取第k层节点个数
int getKLevelNodeCount(Node root, int k) {
if (root == null || k <= 0) return 0;
if (k == 1) return 1;
return getKLevelNodeCount(root.left, k-1) + getKLevelNodeCount(root.right, k-1);
}
// 获取二叉树高度
int getHeight(Node root) {
if (root == null) return 0;
return 1 + Math.max(getHeight(root.left), getHeight(root.right));
}
// 查找值为val的节点
Node find(Node root, int val) {
if (root == null) return null;
if (root.val == val) return root;
Node left = find(root.left, val);
if (left != null) return left;
return find(root.right, val);
}二叉树是数据结构中的核心内容,掌握好二叉树对于理解更复杂的数据结构和算法至关重要。建议读者在学习理论的同时,多动手实现代码,解决实际问题,才能真正掌握二叉树的精髓。