二叉树遍历(层次遍历)(前中后序遍历)(C++实现)
实现代码
#include<bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left;
Node *right;
Node(int value, Node *l, Node *r) : data(value), left(l), right(r) {}
};
Node* create() {
int value;
if (!~scanf("%d", &value)) {
return NULL;
}
Node* root = new Node(value, NULL, NULL);
queue<Node*> q;
q.push(root);
while (~scanf("%d", &value)) {
q.front()->left = new Node(value, NULL, NULL);
q.push(q.front()->left);
if (~scanf("%d", &value)) {
q.front()->right = new Node(value, NULL, NULL);
q.push(q.front()->right);
} else {
break;
}
q.pop();
}
return root;
}
void levelTraverse(Node *root) {
queue<Node*> q;
q.push(root);
while (!q.empty()) {
printf("%-5d ", q.front()->data);
if (q.front()->left) {
q.push(q.front()->left);
}
if (q.front()->right) {
q.push(q.front()->right);
}
q.pop();
}
}
void preOrderTraverse(Node *p) {
if (!p) {
return;
}
printf("%-5d ", p->data);
preOrderTraverse(p->left);
preOrderTraverse(p->right);
}
void inOrderTraverse(Node *p) {
if (!p) {
return;
}
inOrderTraverse(p->left);
printf("%-5d ", p->data);
inOrderTraverse(p->right);
}
void postOrderTraverse(Node *p) {
if (!p) {
return;
}
postOrderTraverse(p->left);
postOrderTraverse(p->right);
printf("%-5d ", p->data);
}
int main(int argc, char const *argv[])
{
Node* root = create();
levelTraverse(root);
printf("\n");
preOrderTraverse(root);
printf("\n");
inOrderTraverse(root);
printf("\n");
postOrderTraverse(root);
printf("\n");
return 0;
}
算法思路
- 层序遍历
类似图的BFS,借助队列,初始时,将根节点指针入队,进入循环,打印队首元素对应data值,将队首元素的左右孩子节点入队(若存在),队首出队,若当前节点为该层最后一个节点,则出队后队首节点为下一层第一个节点,否则为出队节点的右兄弟节点,一直循环上述过程直到队列为空。创建二叉树时的算法也为层序插入,与上述遍历算法相似再次不再赘述。
- 前序遍历
利用递归的方式,先访问当前子树的根节点,再递归地访问当前子树的左子树和右子树,初始时根节点为整个二叉树的根节点,然后递归地访问左子树、右子树,一直递归直到遍历结束,遇到左子树或右子树为空则return
- 中序遍历
利用递归的方式,先访问当前子树的左子树,再递归地访问当前子树的根节点和右子树,初始时根节点为整个二叉树的根节点的左子树,然后递归地访问根节点和右子树,一直递归直到遍历结束,遇到左子树或右子树为空则return
- 后序遍历
利用递归的方式,先递归地访问当前子树的左子树和右子树,再递归地访问当前根节点,一直递归直到遍历结束,遇到左子树或右子树为空则return
- 前中后序遍历
前中后序遍历的“前”、“中”、“后”是相对当前子树的根节点而言的
样例图解
测试数据
1 2 3 4 5 6 7 8 9 10
输出结果
1 2 3 4 5 6 7 8 9 10
1 2 4 8 9 5 10 3 6 7
8 4 9 2 10 5 1 6 3 7
8 9 4 10 5 2 6 7 3 1
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!