剑指offer-24:搜索二叉树的后序遍历
2017-09-12 14:31
375 查看
给定一个序列,判断是否是某二叉搜索树的后续遍历序列?
分析:
二叉搜索树,特点是一棵二叉树,左子树的结点值均小于根结点值,右子树的结点值均大于根结点值。查找时,和根结点比较,从而转向搜索左或右子树,类似于二分查找。
后续遍历是左-右-根。则最后一个数字为根结点值。前面小于根的为左子树,大于根的为右子树,递归仍符合该性质。
代码:
分析:
二叉搜索树,特点是一棵二叉树,左子树的结点值均小于根结点值,右子树的结点值均大于根结点值。查找时,和根结点比较,从而转向搜索左或右子树,类似于二分查找。
后续遍历是左-右-根。则最后一个数字为根结点值。前面小于根的为左子树,大于根的为右子树,递归仍符合该性质。
代码:
// offer-24-houxubianli.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> using namespace std; bool verity(int * a, int length) { if(a == nullptr || length <= 0) return false; // 当遇到一个结点时返回真 if(length == 1) return true; int root = a[length - 1]; // 找到左子树序列 int i = 0; for(; i < length-1; ++i) { if(a[i] > root) break; } // 剩下的为右子树,遍历若有小于根的,直接返回假 int j = i; for(; j < length-1; ++j) { if(a[j] < root) return false; } // 跑到这里说明根结点一层符合,需要看左右子树 // 当i=0即左子树为空时,返回真 // 否则递归处理左子树 bool left = true; if(i>0) left = verity(a, i); // 当j=length-1即右子树为空,返回真 // 否则递归处理右子树 bool right = true; if(j<length-1) right = verity(a+i, length-i-1); // 返回左右子树的并 return left && right; } // 测试 int _tmain(int argc, _TCHAR* argv[]) { int a[] = {5,7,6,9,11,10,8}; cout << verity(a, 7) << endl; // true int b[] = {8,5,6,8,7}; cout << verity(b, 5) << endl; // false return 0; }
相关文章推荐
- 剑指Offer——搜索二叉树的后序遍历
- 剑指offer 判断数组的后序遍历是否为搜索二叉树
- 剑指offer面试题[24]-二插搜索树的后序遍历序列
- 剑指offer_二叉树---二叉搜索树的后序遍历
- 剑指offer代码解析——面试题24二叉搜索树的后序遍历序列
- 【剑指offer】面试题24:二叉搜索树的后序遍历序列
- 剑指offer面试题:输入某二叉树的前序遍历和中序遍历的结果,输出后序遍历结果。
- 剑指offer之面试题24:二叉搜索树的后序遍历序列
- 【剑指offer】4.3举例让抽象问题具体化——面试题24:二叉搜索树的后序遍历序列
- 剑指offer代码解析——面试题24二叉搜索树的后序遍历序列
- 剑指offer-面试题24 二叉搜索树的后序遍历序列
- 剑指offer 24 二叉搜索树的后序遍历序列
- 剑指offer面试题24-二叉搜索树的后序遍历序列
- 剑指Offer 24 二叉搜索树的后序遍历序列
- 【剑指offer24】输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
- 剑指offer--从上往下打印二叉树--层次遍历、广度优先搜索
- 剑指offer面试题24:二叉搜索树的后序遍历序列
- 剑指offer 二叉树(搜索二叉树插入,遍历)未完待续。。
- 剑指offer 面试题24 二叉搜索树的后序遍历序列
- 剑指Offer 24题 二叉搜索树的后序遍历序列 Java