时间:2021-05-19
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果.
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
本题网上已经有用递归单纯判断的解法.
个人解法: 先得到序列对应的中序序列, 然后看中序序列是否从小到大有序, 得出判断.
相比:时间复杂度相同, 增加N的空间, 但可求得对应的中序序列.
以下为代码:
复制代码 代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 100
int seq[LEN + 1] = {0};
int *mid = NULL;
int pos = 1;
void getmid(int start, int end);
int check(int num);
int main()
{
int val;
int num;
int ret;
int i;
printf("input the sequence, end it with '-9999': ");
num = 1;
scanf("%d", &val);
while(val != -9999)
{
seq[num] = val;
num ++;
scanf("%d", &val);
}
num--;
mid = (int *)malloc((num + 1) * sizeof(int));
if(mid == NULL)
{
printf("malloc failed.\n");
exit(1);
}
memset(mid, 0, num + 1);
getmid(1, num);
printf("mid: ");
for(i = 1; i< num +1; i++)
{
printf("%d ", mid[i]);
}
printf("\n");
ret = check(num);
if(ret == -1)
{
printf("no.\n");
}
else
{
printf("yes\n");
}
return 0;
}
void getmid(int start, int end)
{
int flag;
if(start > end)
{
return;
}
if(start == end)
{
mid[pos] = seq[end];
pos ++;
return;
}
int par;
par = start;
flag = 0;
while(par < end)
{
if(seq[par] > seq[end])
{
flag = 1;
getmid(start, par - 1);
mid[pos] = seq[end];
pos ++;
getmid(par, end - 1);
break;
}
par ++;
}
if(!flag)
{
getmid(start, end-1);
mid[pos] = seq[end];
pos ++;
}
}
int check(int num)
{
int i;
for(i = 1; i < num; i++)
{
if(mid[i] > mid[i+1])
{
return -1;
}
}
return 0;
}
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
二叉树是一种非常重要的数据结构。本文总结了二叉树的常见操作:二叉树的构建,查找,删除,二叉树的遍历(包括前序遍历、中序遍历、后序遍历、层次遍历),二叉搜索树的构
按层次遍历二元树问题描述:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。例如输入:?123458//610////57911输出
二叉树首先要解决构建问题,才能考虑后续的遍历,这里贴出通过先序构建二叉树,同时包含四种二叉树的遍历方法(先序,中序,后序,逐层)第一、定义BinaryTreeN
本文实例讲述了PHP根据树的前序遍历和中序遍历构造树并输出后序遍历的方法。分享给大家供大家参考,具体如下:先来看看前序遍历、中序遍历与后序遍历原理图:根据树的前
本文实例讲述了C#使用前序遍历、中序遍历和后序遍历打印二叉树的方法。分享给大家供大家参考。具体实现方法如下:publicclassBinaryTreeNode{