如有不对,不吝赐教
下面进入正题:
对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。
输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。
输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。
输入样例1:
7
8 6 5 7 10 8 11
输出样例1:
YES
5 7 6 8 11 10 8
输入样例2:
7
8 6 8 5 10 9 11
输出样例2:
NO
这道题是对二叉搜索树或者其镜像树的判断,一种很容易想到的方法就是自己按照它的数据递归地来建一棵树,然后在来一遍后序遍历,我在这里给一种直接使用先序遍历来得到后序遍历以及判断的代码。
下面先给出代码,然后在逐条分析:
#include<stdio.h>
int pos; //填充的位置
int mirror; //是否是镜像树
int lastroot=-1; //表示上一个根节点
int Judge(int *postOrder,int *data,int left,int right,int branch);
//branch表示该子树是上一个节点的哪个个分支 初始节点为-1 左子树为0 右子树为1
int main(void)
{
int N,i;
int flag; //是二叉搜索树或者镜像二叉搜索树
scanf("%d",&N);
int data[N];
int postOrder[N];
pos=N-1;
for(i=0;i<N;i++)
scanf("%d",data+i); //输入数据
if(N>1){
if(data[0]<data[1])
mirror=1; //说明是镜像树
flag=Judge(postOrder,data,0,N-1,-1);
}
else{
flag=1;
postOrder[0]=data[0