二叉搜索树的后序遍历序列
2016-07-06 23:11
183 查看
题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
思路:找出数组中的根节点,将数组分为左右子树,递归判断是否满足二叉搜索树的性质:
左子树都比自己小。
右子树都比自己大。
如果按照后序遍历,先左后右最后根的顺序来遍历树,数组的最后一个元素肯定是自己(父节点)
然后剩余的部分分成两个部分,第一部分都比自己小(左子树部分),第二部分都比自己大(右子树部分),
递归检验出是否是二叉搜索树的后序遍历(判断是否符合二叉排序树的性质)。
递归函数:
递归的终止条件是当前树的结点总数为0
判断是否是二叉排序树的方法:首先,找到第一个大于根结点的结点位置,将数组分为两部分,判断右子树中的全部结点是否均大于根结点的值
思路:找出数组中的根节点,将数组分为左右子树,递归判断是否满足二叉搜索树的性质:
左子树都比自己小。
右子树都比自己大。
如果按照后序遍历,先左后右最后根的顺序来遍历树,数组的最后一个元素肯定是自己(父节点)
然后剩余的部分分成两个部分,第一部分都比自己小(左子树部分),第二部分都比自己大(右子树部分),
递归检验出是否是二叉搜索树的后序遍历(判断是否符合二叉排序树的性质)。
递归函数:
递归的终止条件是当前树的结点总数为0
判断是否是二叉排序树的方法:首先,找到第一个大于根结点的结点位置,将数组分为两部分,判断右子树中的全部结点是否均大于根结点的值
<span style="font-family:Microsoft YaHei;">#include <stdio.h> #include <stdlib.h> int judge_bst(int *arr, int len) { int i, j, root; // 递归终止条件 if (len <= 0) return true; //如果数组为空则返回0; root = *(arr + len - 1); // 区分左子树 for (i = 0; i < len - 1; i ++) { if (*(arr + i) > root) break; } // 查找右子树是否符合要求 for (j = i; j < len - 1; j ++) { if (*(arr + j) < root) return false; } // 递归的判断左右子树是否是二叉搜索树 int left, right; left = true; left = judge_bst(arr, i); right = true; right = judge_bst(arr + i, len - 1 - i); return (right && left); } </span>
相关文章推荐
- 比较好的刷题网站推荐
- HDU 1175 连连看
- Spark的性能调优
- 嵌入式C学习笔记(一)嵌入式概述
- java中求两个数的最小公倍数,最大公约数的简便方法
- Matlab: num与date的格式转换
- iterator的方法
- Spring的代理方式
- AOP编程之前置通知
- WeakReference 在android中的应用
- CodeForces 518B Tanya and Postcard
- 从.c文件到可执行文件的四个阶段
- java Thread方法解析: sleep join wait notify notifyAll
- nginx 内置预定义变量
- Fragment bug看这里
- 图文解释XCode常用快捷键的使用
- JavaScript中有关于浏览器坐标理解
- windows编程之应用层的线程同步
- hdu1045 Fire Net
- 练习四1011草儿。。