《剑指offer》第三十三题(二叉搜索树的后序遍历序列)
// 面试题33:二叉搜索树的后序遍历序列
// 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。
// 如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。 #include <iostream> // BST:Binary Search Tree,二叉搜索树
bool VerifySquenceOfBST(int sequence[], int length)
{
if (sequence == nullptr || length <= )//先看错误输入
return false; int root = sequence[length - ];//后续遍历的最后一个是根节点 // 在二叉搜索树中左子树的结点小于根结点
int i = ;//设成非循环变量
for (; i < length - ; ++i)//先加后判断,所以得到的i不是下标,是长度
{
if (sequence[i] > root)
break;
} // 在二叉搜索树中右子树的结点大于根结点
int j = i;//这里用到i,所以上述i不拿到循环里
for (; j < length - ; ++j)//只检测右子树有没有小于根节点的,有就不满足二叉搜索树的性质
{
if (sequence[j] < root)
return false;
} // 判断左子树是不是二叉搜索树
bool left = true;
if (i > )//结合上条初始化为true,这里就能限制左子树为空子树的情况
left = VerifySquenceOfBST(sequence, i); // 判断右子树是不是二叉搜索树
bool right = true;
if (i < length - )//同上
right = VerifySquenceOfBST(sequence + i, length - i - ); return (left && right);
} // ====================测试代码====================
void Test(const char* testName, int sequence[], int length, bool expected)
{
if (testName != nullptr)
printf("%s begins: ", testName); if (VerifySquenceOfBST(sequence, length) == expected)
printf("passed.\n");
else
printf("failed.\n");
} // 10
// / \
// 6 14
// /\ /\
// 4 8 12 16
void Test1()
{
int data[] = { , , , , , , };
Test("Test1", data, sizeof(data) / sizeof(int), true);
} // 5
// / \
// 4 7
// /
// 6
void Test2()
{
int data[] = { , , , };
Test("Test2", data, sizeof(data) / sizeof(int), true);
} // 5
// /
// 4
// /
// 3
// /
// 2
// /
//
void Test3()
{
int data[] = { , , , , };
Test("Test3", data, sizeof(data) / sizeof(int), true);
} // 1
// \
// 2
// \
// 3
// \
// 4
// \
//
void Test4()
{
int data[] = { , , , , };
Test("Test4", data, sizeof(data) / sizeof(int), true);
} // 树中只有1个结点
void Test5()
{
int data[] = { };
Test("Test5", data, sizeof(data) / sizeof(int), true);
} void Test6()
{
int data[] = { , , , };
Test("Test6", data, sizeof(data) / sizeof(int), false);
} void Test7()
{
int data[] = { , , , , , , };
Test("Test7", data, sizeof(data) / sizeof(int), false);
} void Test8()
{
Test("Test8", nullptr, , false);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
Test8();
system("pause");
return ;
}

《剑指offer》第三十三题(二叉搜索树的后序遍历序列)的更多相关文章
- 剑指Offer面试题:22.二叉搜索树的后序遍历序列
一.题目:二叉搜索树的后序遍历序列 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 例如在下面 ...
- 剑指offer面试题24:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是返回true,否则返回false. 假设输入的数组任意两个数字都不相同 解题思路:二叉搜索树的特点是根节点的左子树的值小于等 ...
- 《剑指offer》面试题33. 二叉搜索树的后序遍历序列
问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 true,否则返回 false.假设输入的数组的任意两个数字都互不相同. 参考以下这颗二叉搜索树: 5 / \ ...
- 《剑指offer》面试题24 二叉搜索树的后序遍历序列 Java版
(判断一个元素均不相同的序列是否为一个BST的LRD) 书中方法:首先对于二叉搜索树,左子树中的所有元素小于根节点小于右子树中的所有元素,然后后序遍历序列最后一个元素是根节点,这是我们已知的条件.这道 ...
- 剑指Offer(二十三):二叉搜索树的后序遍历序列
剑指Offer(二十三):二叉搜索树的后序遍历序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 【剑指Offer】二叉搜索树的后序遍历序列 解题报告(Python)
[剑指Offer]二叉搜索树的后序遍历序列 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervi ...
- 《剑指offer》二叉搜索树的后序遍历序列
本题来自<剑指offer> 二叉搜索树的后序遍历序列 题目: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字 ...
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列2013-11-23 03:16 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出 ...
- 剑指Offer:二叉搜索树的后序遍历序列【33】
剑指Offer:二叉搜索树的后序遍历序列[33] 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ...
随机推荐
- Ajax—web中ajax的常用方式
什么Web2.0的特点? 1:注重用户贡献度 2:内容聚合RSS协议(每小块都个性化,单独加载单独请求,不用全部刷新--Ajax) 3:更丰富的用户体验 Ajax的概念? "Asynchro ...
- 浏览器css hack
(1)*: IE6+IE7都能识别*,而标准浏览器FF+IE8是不能识别*的; (2)!important: 除IE6不能识别 !important外, FF+IE8+IE7都能识别!import ...
- 网络流-最大流 Dinic模板
#include <bits/stdc++.h> using namespace std; #define MP make_pair #define PB push_back #defin ...
- Data Center Drama 欧拉回路的应用
这题说的是给了n个点 和m条边, 这m条边是无向的,任务是将这些边变成有向的,并且添加最少的有向边使得这个图中每个点的入度为偶数, 出度为偶数. 我们可以考虑使用欧拉回路来解决这个问题,这样说,假如一 ...
- [转]autoid文件上传
原文地址:https://www.cnblogs.com/yoyoketang/p/7612026.html 前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三 ...
- python之路----线程
线程概念的引入背景 进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...
- shell脚本简单实例
1.模拟linnux登录shell #/bin/bashecho -n "login:" read nameecho -n "password:"read pa ...
- jquery中的load方法加载页面无法缓存问题
在A页面中调用JQuery中的load方法,加载另一个B页面,B页面中的样式文件和JS文件无法从浏览器缓存中获取,每次都是实时获取.这是因为B页面的HTML经load方法处理后,会为每个样式和JS文件 ...
- Java 实现后缀xls文件读取
Java 实现后缀xls文件读取 一.开发环境 poi采用的3.9版本 + JDK1.6 + Myeclipse 二,JAR包 三.实现代码 实体类:UserRoleBean package nc.x ...
- 20145321 《网络对抗技术》 MSF基础应用
20145321 <网络对抗技术> MSF基础应用 实验内容 掌握metasploit的基本应用方式以及常用的三种攻击方式的思路 主动攻击,即对系统的攻击,不需要被攻击方配合,这里以ms0 ...