图论入门【数据结构基础】:什么是树?如何表示树?
之前我们有分别讲解二叉树的三种遍历的相关代码实现:
⭐算法OJ⭐二叉树的前序遍历【树的遍历】(C++实现)Binary Tree Preorder Traversal
⭐算法OJ⭐二叉树的中序遍历【树的遍历】(C++实现)Binary Tree Inorder Traversal
⭐算法OJ⭐二叉树的后序遍历【树的遍历】(C++实现)Binary Tree Postorder Traversal
二叉树的三种主要遍历方式是:前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)和后序遍历(Postorder Traversal)。它们的区别在于访问根节点、左子树和右子树的顺序不同。
访问顺序:根节点 -> 左子树 -> 右子树
对于以下二叉树:
1
/ \
2 3
/ \
4 5
前序遍历结果为:1 2 4 5 3
访问顺序:左子树 -> 根节点 -> 右子树
对于以下二叉树:
1
/ \
2 3
/ \
4 5
中序遍历结果为:4 2 5 1 3
访问顺序:左子树 -> 右子树 -> 根节点
对于以下二叉树:
1
/ \
2 3
/ \
4 5
后序遍历结果为:4 5 2 3 1
遍历方式 | 访问顺序 | 特点 |
---|---|---|
前序遍历 | 根 -> 左 -> 右 | 适合复制树、生成前缀表达式 |
中序遍历 | 左 -> 根 -> 右 | 对二叉搜索树(BST)会生成升序序列,适合获取有序数据或生成中缀表达式 |
后序遍历 | 左 -> 右 -> 根 | 适合删除树、生成后缀表达式 |
以下是三种遍历方式的C++实现:
void preorder(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " "; // 访问根节点
preorder(root->left); // 递归左子树
preorder(root->right); // 递归右子树
}
void inorder(TreeNode* root) {
if (root == NULL) return;
inorder(root->left); // 递归左子树
cout << root->val << " "; // 访问根节点
inorder(root->right); // 递归右子树
}
void postorder(TreeNode* root) {
if (root == NULL) return;
postorder(root->left); // 递归左子树
postorder(root->right); // 递归右子树
cout << root->val << " "; // 访问根节点
1
/ \
2 3
/ \
4 5
Given the root
of a binary tree, return the inorder/preorder/postorder traversal of its nodes’ values.
Example 1:
Input: root = [1,null,2,3]
中序遍历 Output: [1,3,2]
前序遍历 Output: [1,2,3]
后序遍历 Output: [3,2,1]
Example 2:
Input: root = [1,2,3,4,5,null,8,null,null,6,7,9]
中序遍历 Output: [4,2,6,5,7,1,3,9,8]
前序遍历 Output: [1,2,4,5,6,7,3,8,9]
后序遍历 Output: [4,6,7,5,2,9,8,3,1]
Example 3:
Input: root = []
Output: []
Example 4:
Input: root = [1]
Output: [1]