判断是否为BST
递归的方法,用返回false的方法。中序遍历的想法很好,空间浪费。遍历的过程记录上一次的值进行比较。
//题目描述 // //请实现一个函数,检查一棵二叉树是否为二叉查找树。 //给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。 #include<iostream> using namespace std; struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; class Checker { public: //先想到的是返回true的情况, //改为return true有错误。 bool checkBST(TreeNode* root) { // write code here if (root == NULL) return true; if (root->left && root->left->val > root->val) return false; if (root->left && root->left->right && root->left->right->val>root->val) return false; if (root->right && root->right->val < root->val) return false; if (root->right&&root->right->left&&root->right->left->val < root->val) return false; return checkBST(root->left) && checkBST(root->right); } }; // //《程序员面试金典》 代码详解:http ://blog.csdn.net/zdplife/article/category/5799903 //题目分析: //<方法1> //首先我们想到的是二叉树中序遍历后的结果是有序的,根据这个结果,我们可以中序遍历二叉树,并把遍历结果存放在一个数组里面,然后判断这个数组大小是否是有序数组,如果是有序数组,则是二叉查找树,否则就不是。 //这个方法的时间复杂度是O(N),但是空间复杂度比较高,需要浪费O(N)的存储空间。 //<方法2> //其实在<方法1>的基础上,我们可以在中序遍历的同时,比较大小,每次记录下上次遍历过的元素的值,如果当前元素的值大于上次遍历元素的值,则接着遍历,否则返回false,因为这个记录是一个址传递,所以需要用到引用形参进行传递。 //这个方法的时间复杂度与<方法1>的时间复杂度相同,只是空间复杂度只需要一个元素O(1)。 class Checker { public: bool checkBST(TreeNode* root) { // write code here int min = INT_MIN; return inOrderCompare(root, min); } bool inOrderCompare(TreeNode* root, int &last) { if (root == NULL) return true; if (!inOrderCompare(root->left, last)) return false; if (root->val < last) return false; last = root->val; if (!inOrderCompare(root->right, last)) return false; return true; } }; //<方法3> //可以根据二叉查找树的定义来判断,二叉树的定义,所有左子树的节点小于根节点,所有右子树的节点大于根节点,并且左右子树也是二叉查找树。所以在递归的过程中,我们只需要传递两个参数(当前根节点对应的二叉树的所有节点的最大值和最小值), //同时不断的更新这两个参数,如果当前节点的值不在这两个数范围中,则直接返回false,否则接着递归便可。 //非递归遍历二叉树,然后判断结果是否递增 #include <stack> #include <vector> class Checker { public: bool checkBST(TreeNode* root) { // write code here stack<TreeNode*> s; TreeNode *pNode = root; vector<int> data; while (pNode != NULL || !s.empty()) { while (pNode != NULL) { s.push(pNode); pNode = pNode->left; } if (!s.empty()) { pNode = s.top(); data.push_back(pNode->val); s.pop(); pNode = pNode->right; } } ; i < data.size() - ; i++) { ]) return false; } return true; } }; //首先利用中序遍历排序,其次遍历检查排序序列是否递增,最后输出结果! class Checker { public: vector<int> res; bool checkBST(TreeNode* root) { // write code here if (root == NULL) return true; bool flag = false; inorder(root); ; i<res.size() - ; i++) { ]) { flag = true; break; } } if (flag) return false; else return true; } void inorder(TreeNode* root){ if (root == NULL) return; inorder(root->left); res.push_back(root->val); inorder(root->right); } };
判断是否为BST的更多相关文章
- [二叉树算法]关于判断是否为BST的算法
//判断是否为BST 搜索树==二叉排序树 1.递归知最大最小值.2.先中序判是否单调 bool IsValidBST(BTNode *p,int low,int high){ if(p==NULL) ...
- 判断二叉树是否BST
一.问题: 请实现一个函数,检查一棵二叉树是否为二叉查找树.给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树. 二.思路: 解法一:从根节点开始遍历二叉树, ...
- [剑指offer] 二叉搜索树的后序遍历序列 (由1个后续遍历的数组判断它是不是BST)
①题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. ②思路 1.后续遍历的数组里,最后一个元素是根. 2 ...
- 算法——dfs 判断是否为BST
95. 验证二叉查找树 中文English 给定一个二叉树,判断它是否是合法的二叉查找树(BST) 一棵BST定义为: 节点的左子树中的值要严格小于该节点的值. 节点的右子树中的值要严格大于该节点的值 ...
- leetcode 98,判断二叉树为BST
方法一,记录子树的上界和下界,root的左子树一定小于root的值,root的右子树一定大于root的值,然后递归左子树和右子树 public class Solution { public bool ...
- 【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)
题意: 输入一个正整数N(<=1000),接下来输入N个点的序号.如果刚才输入的序列是一颗二叉搜索树或它的镜像(中心翻转180°)的先序遍历,那么输出YES并输出它的后序遍历,否则输出NO. t ...
- [Locked] Largest BST Subtree
Largest BST Subtree Given a binary tree, find the largest subtree which is a Binary Search Tree (BST ...
- 333. Largest BST Subtree
nlgn就不说了..说n的方法. 这个题做了好久. 一开始想到的是post-order traversal. 左右都是BST,然后自己也是BST,返还长度是左+右+自己(1). 左右其中一个不是,或者 ...
- 剑指Offer题解(Python版)
https://blog.csdn.net/tinkle181129/article/details/79326023# 二叉树的镜像 链表中环的入口结点 删除链表中重复的结点 从尾 ...
随机推荐
- mac 下tomcat启动报错 unknown host
解决方法:sudo scutil --set HostName localhost
- code manager tools TotoiseSVN安装及使用
TotoiseSVN安装及使用 TotoiseSVN官方下载地址:http://tortoisesvn.net/downloads.html TotoiseSVN安装:很简单,一路直下:就不在这说了, ...
- jvm 内存整理 -----学习
分为:方法区 ,堆 ,栈 ,本地栈 ,程序计数器 1.程序计数器 保存当前线程执行的字节码行号指示器,解释器工作时,都是通过改变计数器的值来获取下一条程序指令,循环.异常.跳转.分支. ...
- centos chrome
在centos6.X和redhat enterprise 中安装chrome,我找了很久都不行,今天终于找到了可以用下脚本那安装: #! /bin/bash # Google Chrome Insta ...
- poj-2236 Wireless Network &&poj-1611 The Suspects && poj-2524 Ubiquitous Religions (基础并查集)
http://poj.org/problem?id=2236 由于发生了地震,有关组织组把一圈电脑一个无线网,但是由于余震的破坏,所有的电脑都被损坏,随着电脑一个个被修好,无线网也逐步恢复工作,但是由 ...
- c#获取机器唯一识别码
前言 在客户端认证的过程中,我们总要获取客户机的唯一识别信息,曾经以为MAC地址是不会变的,但是现在各种改,特别是使用无线上网卡,MAC地址插一次变一次,所以这样使用MAC就没有什么意义了,怎么办,又 ...
- [转载]java的几种对象(PO,VO,DAO,BO,POJO)解释
原文地址:java的几种对象(PO,VO,DAO,BO,POJO)解释作者:munandong 一.PO:persistant object 持久对象,可以看成是与数据库中的表相映射的java对象.最 ...
- js方式进行地理位置的定位api搜集
新浪 //int.dpool.sina.com.cn/iplookup/iplookup.php?format=js //int.dpool.sina.com.cn/iplookup/iplookup ...
- I.MX6 Android backlight modify by C demo
/************************************************************************** * I.MX6 Android backligh ...
- UVALive 5713 Qin Shi Huang's National Road System秦始皇修路(MST,最小瓶颈路)
题意: 秦始皇要在n个城市之间修路,而徐福声可以用法术位秦始皇免费修1条路,每个城市还有人口数,现要求徐福声所修之路的两城市的人口数之和A尽量大,而使n个城市互通需要修的路长B尽量短,从而使得A/B最 ...