PAT(Advanced)甲级1102 Invert a Binary Tree C++实现
题目链接
题目大意
给定二叉树将其左右子树逆转,输出逆转后层次遍历和中序遍历的序列
算法思路
根据题意及二叉树先序遍历定义,找出根节点,并从根节点开始,将二叉树根节点的左右子树交换,再递归地转换根节点的左右子树,根节点子树的左右子树也必须交换,递归地,所有结点的左右子树都交换一次即可,在输出层次遍历序列和中序遍历序列
void invert(int p) {
if (p == -1) {
return;
}
swap(binaryTree[p].left, binaryTree[p].right);
invert(binaryTree[p].left);
invert(binaryTree[p].right);
}
AC代码
/*
author : eclipse
email : eclipsecs@qq.com
time : Fri Jun 26 23:23:37 2020
*/
#include <bits/stdc++.h>
using namespace std;
struct Node {
int left;
int right;
};
bool flag = true;
vector<Node> binaryTree;
int root;
void levelOrderTraverse() {
queue<int> q;
q.push(root);
while (!q.empty()) {
int front = q.front();
q.pop();
if (binaryTree[front].left != -1) {
q.push(binaryTree[front].left);
}
if (binaryTree[front].right != -1) {
q.push(binaryTree[front].right);
}
if (front == root) {
printf("%d", front);
} else {
printf(" %d", front);
}
}
}
void inOrderTraverse(int p) {
if (p == -1) {
return;
}
inOrderTraverse(binaryTree[p].left);
if (flag) {
printf("%d", p);
flag = false;
} else {
printf(" %d", p);
}
inOrderTraverse(binaryTree[p].right);
}
void invert(int p) {
if (p == -1) {
return;
}
swap(binaryTree[p].left, binaryTree[p].right);
invert(binaryTree[p].left);
invert(binaryTree[p].right);
}
int main(int argc, char const *argv[]) {
int N;
scanf("%d", &N);
binaryTree.resize(N);
vector<bool> children;
children.resize(N);
for (int i = 0; i < N; i++) {
string left, right;
cin >> left >> right;
if (left == "-") {
binaryTree[i].left = -1;
} else {
int child = atoi(left.c_str());
children[child] = true;
binaryTree[i].left = child;
}
if (right == "-") {
binaryTree[i].right = -1;
} else {
int child = atoi(right.c_str());
children[child] = true;
binaryTree[i].right = child;
}
}
for (int i = 0; i < children.size(); i++) {
if (!children[i]) {
root = i;
break;
}
}
invert(root);
levelOrderTraverse();
printf("\n");
inOrderTraverse(root);
return 0;
}
样例输入
8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
样例输出
3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1
鸣谢
最后
- 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
263

被折叠的 条评论
为什么被折叠?



