判断二叉搜索树是否为后序遍历序列
来源:互联网 发布:亚信智慧数据 编辑:程序博客网 时间:2024/05/29 12:11
#include <iostream>using namespace std;//给定一个整数数组,判断是否是一个二叉搜索树的后序遍历结果bool JudgeBSTSequence(int* BinSeq,int length){ int* root = NULL; int* leftStart = NULL; int* rightStart = NULL; //原来写的时候只有length是否为0的判断,认为length为0就意味着输入的序列为空,忽略了到了树的最后, //由于length是通过尾指针减去头指针得到的,因而在叶子节点处length肯定都是为0的,因而得到的结果都是错误的 //而实际上如果输入的数组不为0的话,那么指针必定一直都是不为0的,因而加入BinSeq的判断 //而若BinSeq非空,length为0的时候则可以判断为到达了树的底部,返回true。 if ( BinSeq==NULL ) { cout << "This is a NULL sequence.." << endl; return false; } if ( length>0 ) { root = BinSeq + length - 1; } //最后到达叶子节点 else { return true; } //搜索左子树元素 leftStart = BinSeq; //从序列最左边开始遍历,所有小于根节点的默认先作为左子树元素,剩下的则默认作为右子树元素 while (leftStart < root && *leftStart < *root) { leftStart++; } rightStart = leftStart; //搜索右子树元素 //如果右子树元素中存在小于根节点的,那么说明该序列不是后序遍历的二叉搜索树 while (rightStart<root) { if ( *rightStart< *root) { cout << "This is not a Postorder of BST..." << endl; return false; } rightStart++; } //递归判断左右子树是不是二叉搜索树 bool left = true, right = true; left = JudgeBSTSequence(BinSeq, leftStart - BinSeq); right = JudgeBSTSequence(leftStart, rightStart - leftStart); //只有当左右子树都为二叉搜索树的时候,才能返回真 return (left&right);}// ====================测试代码====================void Test(char* testName, int sequence[], int length, bool expected){ if (testName != NULL) printf("%s begins: ", testName); if (JudgeBSTSequence(sequence, length) == expected) printf("passed.\n"); else printf("failed.\n");}// 10// / \// 6 14// /\ /\// 4 8 12 16void Test1(){ int data[] = { 4, 8, 6, 12, 16, 14, 10 }; Test("Test1", data, sizeof(data) / sizeof(int), true);}// 5// / \// 4 7// /// 6void Test2(){ int data[] = { 4, 6, 7, 5 }; Test("Test2", data, sizeof(data) / sizeof(int), true);}// 5// /// 4// /// 3// /// 2// /// 1void Test3(){ int data[] = { 1, 2, 3, 4, 5 }; Test("Test3", data, sizeof(data) / sizeof(int), true);}// 1// \// 2// \// 3// \// 4// \// 5void Test4(){ int data[] = { 5, 4, 3, 2, 1 }; Test("Test4", data, sizeof(data) / sizeof(int), true);}// 树中只有1个结点void Test5(){ int data[] = { 5 }; Test("Test5", data, sizeof(data) / sizeof(int), true);}//不是后序遍历序列void Test6(){ int data[] = { 7, 4, 6, 5 }; Test("Test6", data, sizeof(data) / sizeof(int), false);}//不是后序遍历序列void Test7(){ int data[] = { 4, 6, 12, 8, 16, 14, 10 }; Test("Test7", data, sizeof(data) / sizeof(int), false);}void Test8(){ Test("Test8", NULL, 0, false);}int main(int argc, char* argv[]){ Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); Test7(); Test8(); return 0;}
0 0
- 判断二叉搜索树是否为后序遍历序列
- 输入一个数列,判断是否为某一个二叉搜索树的后序遍历序列
- 判断给定的数组是否为二叉搜索树的后序遍历序列
- 判断某序列是否为某二叉搜索树的后序遍历
- 剑指offer——判断一个序列是否为二叉搜索树的后序遍历
- 判断是否为二叉搜索树的后序遍历
- 二叉搜索树的后序遍历序列序列判断是否是二叉搜索树
- 二叉树——判断整数序列是否为二叉搜索树的后序序列
- 《剑指offer》:[24]判断一个序列是否为二叉树的后序遍历序列
- Interview----判断整数序列是否是二叉搜索树的后序遍历结果
- 24 - 判断是否是二叉搜索树的后序遍历序列
- Java 判断一个序列是否是搜索二叉树的后序遍历结果
- 判断数组是否是二叉搜索树的后序遍历序列 JAVA实现
- 【算法】判断是否是二叉搜索树的后序遍历序列
- 判断整数序列是否为二叉查找树的后序遍历结果
- 【面试题】剑指offer24--判断一个序列是否为二叉树的后序遍历
- 剑指offer 判断数组的后序遍历是否为搜索二叉树
- 判断数组是否为搜索二叉树的后序遍历
- jquery easyui树形级联选中
- Matlab Robotic Toolbox V9.10工具箱(二):正/逆运动学
- osi模型
- android纯代码布局
- The Operation couldn't be completed.(LaunchServicesError error 0.) 的完美解决方法
- 判断二叉搜索树是否为后序遍历序列
- qt中moc的作用
- Chrome浏览器首页被劫持解决办法
- Elastic-Job是否支持动态添加做作业
- 人脸检测——MTCNN
- redis--lists类型及操作
- linux环境下DOL的配置
- 微信小程序初体验
- KB、kb和MB、Mb的区别