算法习题9:判断整数序列是不是二元查找树的后序遍历结果
来源:互联网 发布:wav整轨转分轨软件 编辑:程序博客网 时间:2024/05/18 15:51
判断整数序列是不是二元查找树的后序遍历结果
题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
如果是返回true,否则返回false。
例如输入5、7、6、9、11、10、8,由于这一整数序列是如下树的后序遍历结果:
8
/ \
6 10
/ \ / \
5 7 9 11
因此返回true。
如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回false。
------------------------------
后序排列是L R M 先左再右最后中间的输出,所以输出可以分成三块
左子树块 右子树块 父亲节点
当然左子树块的所有节点必须小于父亲节点, 右子树块的所有节点必须大于父亲节点 如果有出现不同则return false
然后递归 把左子树块分成那三块,比较
参考:http://bbs.csdn.net/topics/350118968
我以另一种笨拙点的方法实现,
我从数组后面开始生成一个二叉树,从后序排列的规律看,如果a(i-1)>a(i) 那么就必须让a(i-1)是a(i)的右亲子节点,否则这就不符和后序输出
其实这个思想也是要求 右子树 必须全部大于父亲节点,如果大于了,但是右子树块里还有小于父亲节点的数,那么是不允许的
程序最后还给出矫正后的输出
//============================================================================// Name : JudgeBinaryTree.cpp// Author : YLF// Version :// Copyright : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>using namespace std;#define MAX 20struct Node{int value;Node* left;Node* right;};Node* pre = NULL;Node* head = NULL;/* * 这里的判断规则是:如果a(n-1)>a(n)而且a(n-1)还不是a(n)的子节点 那么不是后序遍历 */bool addNode(Node* &p, int* arr, int index);void LRD(Node* p);int main() {int arr[MAX];int input = 0;int index = -1;while(true){index++;cin>>input;if(input!=-1)arr[index] = input;else break;}//开始判断bool success = true;while(index>0){index--;if(!addNode(head, arr, index)){success = false;}}if(!success){cout<<"not!!"<<endl<<"right sort:"<<endl;LRD(head);}elsecout<<"yes!!";return 0;}bool addNode(Node* &p, int* arr, int index){if(p == NULL){Node* temp = new Node();temp->value = arr[index];temp->left = NULL;temp->right = NULL;p = temp;if((head!=temp) && arr[index]>arr[index+1])if(pre->right != p)return false;pre = p;return true;}if(arr[index] < p->value)return addNode(p->left, arr, index);else if(arr[index] >= p->value)return addNode(p->right, arr, index);}void LRD(Node* p){if(p->left!=NULL)LRD(p->left);if(p->right != NULL)LRD(p->right);cout<<p->value<<" ";}
7 4 6 5 -1
not!!
right sort:
4 7 6 5
--------------------
5 7 6 9 11 10 8 -1
yes!!
- 算法习题9:判断整数序列是不是二元查找树的后序遍历结果
- 算法讨论(五)--判断整数序列是不是二元查找树的后序遍历结果
- 算法题11 判断整数序列是不是二元查找树的后序遍历结果
- 算法-判断整数序列是不是二元查找树的后序遍历结果
- 【算法】判断整数序列是不是二元查找树的后序遍历结果
- 算法—判断整数序列是不是二元查找树的后序遍历结果
- 微软算法100道题-----判断整数序列是不是二元查找树的后序遍历结果
- MS100(9)-判断整数序列是不是二元查找树的后序遍历结果
- 9、判断整数序列是不是二元查找树的后序遍历结果
- 9、判断整数序列是不是二元查找树的后序遍历结果
- 第9 题 判断整数序列是不是二元查找树的后序遍历结果
- 判断整数序列是不是二元查找树的后序遍历结果(9)
- 9 判断整数序列是不是二元查找树的后序遍历结果
- 第9题:判断整数序列是不是二元查找树的后序遍历结果
- 9.判断整数序列是不是二元查找树的后序遍历结果(树)
- 判断整数序列是不是二元查找树的后序遍历结果
- 判断整数序列是不是二元查找树的后序遍历结果
- 判断整数序列是不是二元查找树的后序遍历结果
- UIView部分圆角设置
- Python开发环境Wing IDE如何检查Python集成
- Bat 脚本 学习记录一
- js修改input的type属性问题探讨
- ARM和x86的区别
- 算法习题9:判断整数序列是不是二元查找树的后序遍历结果
- .Net调用Office Com组件的原理及问题
- UISlider 滑块控件—IOS开发
- php文件加锁 lock_sh ,lock_ex
- Spring AOP介绍及源码分析
- 产品经理自我修养
- Outlook 2007使用IMAP收邮件只有收件箱解决办法
- mac、xcode快捷键使用
- 求一个数组中的最大值和最小值的算法改进 php 实现