一、题目:
给你一棵 n 个节点的二叉树,节点的编号为 1 到 n,二叉树的根为 1 号节点。请你求出这棵二叉树的先序、中序和后序遍历的结果。
输入格式:
第一行一个整数 n 表示节点数。
接下来 n 行,每行两个整数,第一个整数表示 i 号节点的左儿子的编号,第二个整数表示 i 号节点的右儿子的编号,如果某个数字为 0 表示没有对应的子节点。
输入保证是一棵二叉树。
输出格式:
输出三行,每行 n 个数代表一种遍历的结果。
第一行为先序遍历的结果,第二行为中序遍历的结果,第三行为后序遍历的结果。
二、代码:
#include <bits/stdc++.h>
using namespace std;
struct Node {
int data;
Node *left, *right;
}root[1050];
int n, l, r;
//前序遍历
void PreOrderTree(Node* root) {
if (root == NULL)
return;
printf("%d ", root->data);
PreOrderTree(root->left);
PreOrderTree(root->right);
}
//中序遍历
void MidOrderTree(Node* root) {
if (root == NULL)
return;
MidOrderTree(root->left);
printf("%d ", root->data);
MidOrderTree(root->right);
}
//后序遍历
void PostOrderTree(Node* root) {
if (root == NULL)
return;
PostOrderTree(root->left);
PostOrderTree(root->right);
printf("%d ", root->data);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
scanf("%d %d", &l, &r);
root[i].data = i;
//若l不为零,则将该结点作为左孩子
if(l)
root[i].left = &root[l];
//若r不为零,则将该结点作为右孩子
if(r)
root[i].right = &root[r];
}
//从根节点开始遍历
PreOrderTree(&root[1]);
printf("\n");
MidOrderTree(&root[1]);
printf("\n");
PostOrderTree(&root[1]);
return 0;
}