数据结构与算法面试题80道(9)

第9题

判断整数序列是不是二元查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。

如果是返回true,否则返回false。

例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:

8

/ \

6    10

/ \ / \

5 7 9 11

因此返回true。

如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。

开始把题看错了,打算建一颗二叉树,后续遍历,然后比较。。。

后来发现原来是判断一个数组能不能是一个二叉树的后续遍历的结果。

想想后序遍历的特点,先遍历左子树,再遍历右子树,最后遍历结点,说明什么?!

数组应该是由比根小的数+比跟大的数+根的值组成。

树的子树的后序遍历的数组有什么特点?!数组应该是由比根小的数+比跟大的数+根的值组成。

没错,可以用递归,只要所有的子树都满足,那么它就可以是一个二叉树的后序数组。

#include<cstdio>
#include<iostream>
using namespace std;

//是否是其中的一段
bool has(const int data[],int length){
    int i,j;
    if(data==NULL||length<=0) return false;
    int root=data[length-1];
    for(i=0;i<length-1;i++)//找到第一个大于root的结点
        if(data[i]>root) break;
    for(j=i;j<length-1;j++)//如果存在比root小的则不是后序遍历
        if(data[j]<root) return false;//运行到这里,说明从整个树看来他是可以成为后序数组的。下面就要分左右开检测是否也能成为后序//数组。
    //如果符合要求,则分别在查找树的左右子树查找。
    bool left=true;
    if(i>0) left=has(data,i);
    bool right=true;
    if(i<length-1) right=has(data+i,length-i-1);
    //所有的左右子树上都符合要求,那么是它可以构成一个二叉树的后续遍历数组
    return (left&&right);
}

int main(){//测试
    int s1[]={5,7,6,9,11,10,8};
    int s2[]={7,4,6,5,8};
    int length1=sizeof(s1)/sizeof(int);
    int length2=sizeof(s2)/sizeof(int);
    if(has(s1,length1)) printf("yes,s1 is the post-order traversal.\n");
    else printf("no,s1 is not the post-order traversal.\n");
    if(has(s2,length2)) printf("yes,s2 is the post-order traversal.\n");
    else printf("no,s2 is not the post-order traversal.\n");
    return 0;
}
时间: 2025-01-04 06:52:22

数据结构与算法面试题80道(9)的相关文章

数据结构与算法面试题80道

由于这些题,实在太火了.所以,应广大网友建议要求,在此把之前已整理公布的前80题, 现在,一次性分享出来.此也算是前80题第一次集体亮相. 此些题,已有上万人,看到或见识到,若私自据为己有,必定为有知之人识破,付出代价. 所以,作者声明: 本人July对以上所有任何内容和资料享有版权,转载请注明作者本人July出处. 向你的厚道致敬.谢谢. ------------------------------------------------------------------------------

数据结构与算法面试题80道(28)

28.整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 这是一道很基本的考查位运算的面试题. 包括微软在内的很多公司都曾采用过这道题. #include<iostream> #include<stdio.h> using namespace std; int howMachOne(int n){ int count=0; while(n){ if(n&1) count

数据结构与算法面试题80道(30)

30.在从1到n的正数中1出现的次数 题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数. 例如输入12,从1到12这些整数中包含1 的数字有1,10,11和12,1一共出现了5次. 分析:这是一道广为流传的google面试题. 最优美的算法就是按位进行分析 我们以21034来分析 如果将个位设为1,只考虑个位数上面的1,会有多少个1.(从1031->1021->1011->...->0001) 104个数包含104个1 如果将十位设为1,只考虑十位数上面的1,会

数据结构与算法面试题80道(23)

第23题(算法):用最简单,最快速的方法计算出下面这个圆形是否和正方形相交."  3D坐标系 原点(0.0,0.0,0.0)圆形:半径r = 3.0圆心o = (*.*, 0.0, *.*)正方形:4个角坐标;  1:(*.*, 0.0, *.*)2:(*.*, 0.0, *.*)3:(*.*, 0.0, *.*)4:(*.*, 0.0, *.*) 没搞懂坐标给的是什么意思,*.*表示坐标的值? 也不清楚圆和正方形是不是实心.如果是实心,那么内含也是相交.如果是空心,内含就是不相交. 单单说说圆

数据结构与算法面试题80道(11)

11.求二叉树中节点的最大距离... 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的, 我们姑且定义"距离"为两节点之间边的个数. 写一个程序, 求一棵二叉树中相距最远的两个节点之间的距离. 错误思想:分别找左右子树到根的最深结点,相加. 错误原因:左子树上的左右子树到根的最深结点相加大于根节点左右子树到根的最深结点相加 正确思想:用动态规划来记录结点左右孩子的最大距离. 正确原因:从错误原因可以知道,最大距离为某一结点到它左右孩子的最大距离和 解题方法:(1)某一结点,左

数据结构与算法面试题80道(3)

3.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大 .要求时间复杂度为O(n). 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18. //从第一个数开始加,和记为sum,用一个变量max记录最大和,如果和小于0,sum=0,扫描整个数组. #include<iostream> #inclu

数据结构与算法面试题80道(10)

第10题 翻转句子中单词的顺序. 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变. 句子中单词以空 符隔开.为简单起见,标点符号和普通字母一样处理. 例如输入“I am a student.”,则输出“student. a am I”. 思路:首先将整个句子按字符翻转,然后将句子的每个单词按字符翻转 #include<cstring> #include<iostream> using namespace std; //交换字母 void swap_word(c

数据结构与算法面试题80道(7)

第7题 微软亚院之编程 判断俩个链表是否相交 给出俩个单向链表的头指针,比如h1,h2,判断这俩个链表是否相交. 为了简化问题,我们假设俩个链表均不带环. 问题扩展: 1.如果链表可能有环列? 2.如果需要求出俩个链表相交的第一个节点列? 思路: 判断两个链表是否相交,并且求第一个节点列(无环). 利用计数 如果两个链表相交,两个链表就会有共同的结点列:统计链表的长度,求两个链表长度差(目的是将两个链表变成到末尾长度相同的两个链表,相交部分一定在里面),然后往后遍历,找到相等的结点,就是第一个结

数据结构与算法面试题80道(26)

6.左旋转字符串 题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串abcdef左旋转2位得到字符串cdefab.请实现字符串左旋转的函数. 要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1). 将abcdefg的前三个左旋.先abcdefg->defabcg->defgbca(时间为n-3) 将问题转换为将bca的前一个左旋.先bca->acb(时间为1) 将问题转换为将cb的前一个左旋.cb->bc(时间为1) 所有时间复