判断给定的序列是否是一棵BST的后序遍历序列
2016-12-03 17:24
316 查看
给定一个序列 ,判断该序列是否是一棵二叉搜索树的后序遍历序列。
比如:
![](https://img-blog.csdn.net/20161203172229756?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我们知道,后序遍历的最后一个元素就是根节点,前边比它小的都位于根的左子树上,比它大的都位于根的右子树上。所以,对于上述的序列:
8是这棵二叉搜索树的根。
3,7 ,6都小于8,都位于8的左子树上。
6又是左子树的根,3小于6,是左子树的左孩子,7大于6,是左子树的右孩子。
11,12都大于8,都位于8的右子树上。
12又是右子树的根,11小于12,是右子树的左孩子,右子树没有右孩子。
这个序列是合法的二叉搜索树的后序遍历序列 ,推导结束。
再如:给定序列是:7 3 6 9 5
5是这棵二叉搜索树的根。
7大于5,所以,这棵树没有左子树。7 3 6 9都位于右子树上。
而右子树的序列中 3小于5,所以这个序列不是合法的二叉搜索树的后序遍历序列。
下边给出代码实现:
比如:
我们知道,后序遍历的最后一个元素就是根节点,前边比它小的都位于根的左子树上,比它大的都位于根的右子树上。所以,对于上述的序列:
8是这棵二叉搜索树的根。
3,7 ,6都小于8,都位于8的左子树上。
6又是左子树的根,3小于6,是左子树的左孩子,7大于6,是左子树的右孩子。
11,12都大于8,都位于8的右子树上。
12又是右子树的根,11小于12,是右子树的左孩子,右子树没有右孩子。
这个序列是合法的二叉搜索树的后序遍历序列 ,推导结束。
再如:给定序列是:7 3 6 9 5
5是这棵二叉搜索树的根。
7大于5,所以,这棵树没有左子树。7 3 6 9都位于右子树上。
而右子树的序列中 3小于5,所以这个序列不是合法的二叉搜索树的后序遍历序列。
下边给出代码实现:
//判断给定序列是否是BST的后序序列 template<typename T> class PostOrder { public: PostOrder(int a[],int n) :_size(n) { _a = new T[_size]; for(int i = 0; i < n; ++i) { _a[i] = a[i]; } } bool IsCurrentPostOrder() { return _IsCurrentPostOrder(_a,_size); } protected: bool _IsCurrentPostOrder(int a[],int len) { if( a == NULL ||len <= 0) return false; //对区间进行分段 int i = 0; for(i = 0; i < len - 1; ++i) { if(a[i] > a[len - 1]) break;//找到分割点 } for(int j = i; j < len - 1 ; ++j) { if(a[j] < a[len - 1])//遇到小于根节点的值,说明不是合法后序序列,返回 return false; } bool left = true; if(i > 0) left = _IsCurrentPostOrder(a,i); bool right = true; if(i < len - 1) right = _IsCurrentPostOrder(a+i,len-i-1); return left && right; } private: T* _a; int _size; }; void TestPostOrder() { //int a[] = {3,7,6,11,12,8}; int a[] = {7,4,6,5}; PostOrder<int> p(a,4); cout<<p.IsCurrentPostOrder()<<endl; }
相关文章推荐
- javascript数据结构之二叉搜索树实现方法
- C#创建二叉搜索树的方法
- Python实现二叉搜索树
- Python二叉搜索树与双向链表转换实现方法
- Python二叉搜索树与双向链表转换实现方法
- 二叉树的递归,非递归遍历,深度优先遍历,广度优先遍历
- 数据结构-二叉搜索树(Binary Search Tree)的C++实现模板
- 二叉搜索树
- LeetCode:Convert Sorted Array to Binary Search Tree
- 二叉搜索树的后序遍历序列
- 根据后序和中序遍历重建二叉树
- 根据后序和中序遍历重建二叉树
- Minimum Depth of Binary Tree
- Balanced Binary Tree
- Maximum Depth of Binary Tree
- 二叉搜索树与平衡二叉树
- 二叉搜索树的后序遍历
- 二叉树后序遍历算法
- poj2255 Tree Recovery 二叉树遍历
- 二叉搜索树的c++实现(含深复制)