给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列。所谓镜面反转,是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N
(≤30),是二叉树中结点的个数。第二行给出其中序遍历序列。第三行给出其前序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树反转后的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
1 2 3 4 5 6 7
4 1 3 2 6 5 7
输出样例:
4 6 1 7 5 3 2
提交结果:
思路分析:(大部分操作可见上一篇 “7-2 树的遍历 (PTA-数据结构)”)
此题难度在于如何用先序和中序创建树,根据前两道题解题经验,一定也要用遍历来创建了,经过前面的借鉴发现,我们已经有了后序和中序创建树的函数算法,中序和先序创建原理和其差不多,也是在中序遍历中找到根节点,然后注意一下递归的传参即可(因为和后序遍历的LRV位置还是有区别的)。
代码区别:
TreeNode* buildTreeMinPost(int min[], int post[], int n){
if(!n)
return NULL;
TreeNode *T = (TreeNode *)malloc(sizeof(struct TreeNode));
T->val = post[n-1]; //后序遍历的最后一个节点就是树的根节点
T->left = T->right = NULL;
//从中序遍历中找到根节点的位置
int index;
for(index=0; index<n; index++) {
if(min[index] == post[n-1]) break;
}
T->left = buildTree(min, post, index);
T->right = buildTree(min+index+1, post+index, n-index-1);
return T;
}
TreeNode* buildTreePreMin(int pre[], int min[], int n){
if(!n)
return NULL;
TreeNode *T = (TreeNode *)malloc(sizeof(struct TreeNode));
T->val = pre[0];
T->left = T->right = NULL;
int index;
for(index=0; index<n; index++)
{
if(min[index] == pre[0]) break;
}
T->left = buildTree(pre+1, min, index);
T->right = buildTree(pre+index+1, min+index+1 , n-index-1);
return T;
}
之后便是对于反转后的层序遍历的序列的输出,这里既然是反转,我们先前已经学习过打印正常顺序的层序遍历(借用队列),则此题即交换一下层序遍历左右打印顺序(从右至左)即可。
void LevelOrderMirror(TreeNode *T)
{
if(T)
{
TreeNode *queue[100];
int left = 0, right = 0;
queue[right++] = T;
while (left < right)
{
TreeNode *bt = queue[left++];
if(bt == T)
printf("%d", bt->val); //为根节点时,无空格输出
else
printf(" %d", bt->val);
if(bt->right)
queue[right++] = bt->right;
if(bt->left)
queue[right++] = bt->left;
}
}
}
代码:
//
// Created by DDD on 2023/11/24.
//
#include <stdio.h>
#include <malloc.h>
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
TreeNode* buildTree(int pre[], int min[], int n){
if(!n)
return NULL;
TreeNode *T = (TreeNode *)malloc(sizeof(struct TreeNode));
T->val = pre[0];
T->left = T->right = NULL;
int index;
for(index=0; index<n; index++)
{
if(min[index] == pre[0]) break;
}
T->left = buildTree(pre+1, min, index);
T->right = buildTree(pre+index+1, min+index+1 , n-index-1);
return T;
}
void LevelOrderMirror(TreeNode *T)
{
if(T)
{
TreeNode *queue[100];
int left = 0, right = 0;
queue[right++] = T;
while (left < right)
{
TreeNode *bt = queue[left++];
if(bt == T)
printf("%d", bt->val); //为根节点时,无空格输出
else
printf(" %d", bt->val);
if(bt->right)
queue[right++] = bt->right;
if(bt->left)
queue[right++] = bt->left;
}
}
}
int main(){
int num;
scanf("%d",&num);
int pre[100];
int min[100];
for(int i=0; i<num;i++){
scanf("%d",&min[i]);
}
for(int i=0; i<num;i++){
scanf("%d",&pre[i]);
}
//makePre(Tree,post,min,num - 1,num,0);
TreeNode TN = *buildTree(pre,min,num);
LevelOrderMirror(&TN);
}
一定要捋一捋这些算法的思想,很重要,不要一味copy,我自己也是!!!