二叉树的建立与遍历程序,遍历包括前序、中序、后序和层次遍历
时间: 2024-06-11 14:10:14 浏览: 117
BiTreeAll.rar_二叉树遍历
二叉树的建立可以通过递归的方式实现,每次先读入当前节点的值,再递归地建立左子树和右子树。遍历二叉树时有四种方式:
1. 前序遍历:先访问根节点,再访问左子树,最后访问右子树。
2. 中序遍历:先访问左子树,再访问根节点,最后访问右子树。
3. 后序遍历:先访问左子树,再访问右子树,最后访问根节点。
4. 层次遍历:按照层次从上到下、从左到右依次访问每个节点。
下面是一段C++代码,实现了二叉树的建立和四种遍历方式。
```cpp
#include <iostream>
#include <queue>
using namespace std;
// 二叉树节点
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 建立二叉树
TreeNode* createTree() {
int val;
cin >> val;
if (val == -1) { // -1表示空节点
return NULL;
}
TreeNode* root = new TreeNode(val);
root->left = createTree();
root->right = createTree();
return root;
}
// 前序遍历
void preOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
cout << root->val << " ";
preOrderTraversal(root->left);
preOrderTraversal(root->right);
}
// 中序遍历
void inOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inOrderTraversal(root->left);
cout << root->val << " ";
inOrderTraversal(root->right);
}
// 后序遍历
void postOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
postOrderTraversal(root->left);
postOrderTraversal(root->right);
cout << root->val << " ";
}
// 层次遍历
void levelOrderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
cout << node->val << " ";
q.pop();
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right);
}
}
}
int main() {
TreeNode* root = createTree();
cout << "前序遍历:";
preOrderTraversal(root);
cout << endl;
cout << "中序遍历:";
inOrderTraversal(root);
cout << endl;
cout << "后序遍历:";
postOrderTraversal(root);
cout << endl;
cout << "层次遍历:";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
输入样例:
```
1 2 -1 -1 3 4 -1 -1 5 -1 -1
```
输出样例:
```
前序遍历:1 2 3 4 5
中序遍历:2 1 4 3 5
后序遍历:2 4 5 3 1
层次遍历:1 2 3 4 5
```
阅读全文