适用级别:普及组
难度系数:4
洛谷:P1827
OJ平台:U0306
深度优先遍历(Depth First Traversals ):
1、前序遍历(Preorder):先访问根结点,然后再前序遍历左子树,再前序遍历右子树(Root,Left,Right)
2、中序遍历(Inorder):先遍历根结点的左子树,然后是访问根结点,最后遍历右子树(Left,Root,Right)
3、后序遍历(Postorder):从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点(Left,Right,Root)
广度优先遍历(Breadth First Traversals ):
层序遍历(Level Order ):从根结点从上往下逐层遍历,在同一层,按从左到右的顺序对结点访问
树的四种遍历方式
前序遍历结果为:ABDFECGHI
中序遍历结果为:DBEFAGHCI
后序遍历结果为:DEFBHGICA
层序遍历结果为:ABCDFGIEH
树的深度遍历代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | /**************************************************************** * 代码作者: Alex Li * 创建时间: 2025-01-11 05:03:55 * 最后修改: 2025-01-11 05:11:07 * 文件描述: 二叉树的深度遍历 ****************************************************************/ #include <iostream> using namespace std; // 定义二叉树节点的结构体 struct Node { int data; // 节点数据 struct Node *left; // 指向左子节点的指针 struct Node *right; // 指向右子节点的指针 }; // 创建新节点的函数 Node* newNode(int data) { Node* temp = new Node; // 动态分配内存创建一个新的节点 temp->data = data; // 节点数据赋值 temp->left = NULL; // 左子节点初始化为 NULL temp->right = NULL; // 右子节点初始化为 NULL return temp; // 返回新创建的节点 } // 中序遍历函数(递归实现):左子树 -> 根节点 -> 右子树 void printInorder(struct Node* node) { if (node == NULL) return; // 递归终止条件:当前节点为空 printInorder(node->left); // 递归遍历左子树 cout << node->data << " "; // 输出当前节点的数据 printInorder(node->right); // 递归遍历右子树 } // 前序遍历函数(递归实现):根节点 -> 左子树 -> 右子树 void printPreorder(struct Node* node) { if (node == NULL) return; // 递归终止条件:当前节点为空 cout << node->data << " "; // 输出当前节点的数据 printPreorder(node->left); // 递归遍历左子树 printPreorder(node->right); // 递归遍历右子树 } // 后序遍历函数(递归实现):左子树 -> 右子树 -> 根节点 void printPostorder(struct Node* node) { if (node == NULL) return; // 递归终止条件:当前节点为空 printPostorder(node->left); // 递归遍历左子树 printPostorder(node->right); // 递归遍历右子树 cout << node->data << " "; // 输出当前节点的数据 } // 主函数 int main() { // 手动创建二叉树的节点 struct Node* root = newNode(1); // 创建根节点,数据为 1 root->left = newNode(2); // 创建左子节点,数据为 2 root->right = newNode(3); // 创建右子节点,数据为 3 root->left->left = newNode(4); // 创建左子节点的左子节点,数据为 4 root->left->right = newNode(5); // 创建左子节点的右子节点,数据为 5 // 输出前序遍历结果 cout << "\nPreorder traversal of binary tree is \n"; printPreorder(root); // 输出中序遍历结果 cout << "\nInorder traversal of binary tree is \n"; printInorder(root); // 输出后序遍历结果 cout << "\nPostorder traversal of binary tree is \n"; printPostorder(root); return 0; // 程序结束 } |
广度优先遍历代码实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | /**************************************************************** * 代码作者: Alex Li * 创建时间: 2025-01-11 05:16:26 * 最后修改: 2025-01-11 05:25:54 * 文件描述: 二叉树的层遍历 ****************************************************************/ #include <iostream> #include <queue> // 引入队列头文件 using namespace std; // 定义二叉树节点结构体 struct node { int data; // 节点数据 node* left; // 左子节点指针 node* right; // 右子节点指针 }; // 创建新节点的函数 node* newNode(int data) { node* Node = new node(); // 动态分配新节点内存 Node->data = data; // 设置节点数据 Node->left = NULL; // 初始化左子节点为空 Node->right = NULL; // 初始化右子节点为空 return Node; // 返回新节点 } // 使用队列实现二叉树的层序遍历 void printLevelOrder(node* root) { if (root == NULL) return; // 空树直接返回 queue<node*> q; // 定义一个队列,用于存储节点 q.push(root); // 将根节点入队 while (!q.empty()) { // 当队列不为空时 node* current = q.front(); // 获取队首节点 q.pop(); // 将队首节点出队 cout << current->data << " "; // 输出当前节点的数据 // 将当前节点的左子节点入队(如果存在) if (current->left != NULL) q.push(current->left); // 将当前节点的右子节点入队(如果存在) if (current->right != NULL) q.push(current->right); } } // 主函数 int main() { // 手动构造二叉树 node* root = newNode(1); // 创建根节点,数据为 1 root->left = newNode(2); // 创建左子节点,数据为 2 root->right = newNode(3); // 创建右子节点,数据为 3 root->left->left = newNode(4); // 左子节点的左子节点,数据为 4 root->left->right = newNode(5); // 左子节点的右子节点,数据为 5 // 打印二叉树的层序遍历结果 cout << "Level Order traversal of binary tree is "; printLevelOrder(root); return 0; // 程序结束 } |
洛谷:U0306/P1827 P1030 B3642