面试21之检查一颗二叉树是否为二叉查找树

来源:互联网 发布:购物类网站数据库设计 编辑:程序博客网 时间:2024/06/05 13:28

题目描述

请实现一个函数,检查一棵二叉树是否为二叉查找树。

给定树的根结点指针TreeNode* root,请返回一个bool,代表该树是否为二叉查找树。


树节点的定义:

struct TreeNode{int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x):val(x),left(NULL),right(NULL){}};


<方法1>

      首先我们想到的是二叉树中序遍历后的结果是有序的,根据这个结果,我们可以中序遍历二叉树,并把遍历结果存放在一个数组里面,然后判断这个数组大小是否是有序数组,如果是有序数组,则是二叉查找树,否则就不是。

       这个方法的时间复杂度是O(N),但是空间复杂度比较高,需要浪费O(N)的存储空间。

void  CheckBST(TreeNode *root,vector<int> &v){if(root == NULL)return ;if(root->left)CheckBST(root->left,v);v.push_back(root->val);if(root->right)CheckBST(root->right,v);}bool CheckBST(TreeNode *root){if(root == NULL)return true;vector<int> v;CheckBST(root,v);for(int i = 1; i < v.size(); ++i){if(v[i-1] > v[i]) //数组中前面一个元素大于后面一个元素,说明不是有序的return false;}return true;}

<方法2>

      其实在<方法1>的基础上,我们可以在中序遍历的同时,比较大小,每次记录下上次遍历过的元素的值,如果当前元素的值大于上次遍历元素的值,则接着遍历,否则返回false,因为这个记录是一个址传递,所以需要用到引用形参进行传递。

     这个方法的时间复杂度与<方法1>的时间复杂度相同,只是空间复杂度只需要一个元素O(1)。

bool CheckBST(TreeNode *root,int &last){if(root == NULL)return true;if(!CheckBST(root->left,last)) //左子树不满足条件,返回false.return false;if(root->val < last)return false;last = root->val;if(!CheckBST(root->right,last)) //右子树不满足条件,返回false.return false;return true;}bool CheckBST(TreeNode *root){if(root == NULL)return true;//int last = INT_MIN; //last为上次访问的元素的值。不知道为啥linux下显示无法知道INT_MIN的定义。int last = -100000;return CheckBST(root,last);}

<方法3>  
          
    可以根据二叉查找树的定义来判断,二叉树的定义,所有左子树的节点小于根节点,所有右子树的节点大于根节点,并且左右子树也是二叉查找树。所以在递归的过程中,我们只需要传递两个参数(当前根节点对应的二叉树的所有节点的最大值和最小值),同时不断的更新这两个参数,如果当前节点的值不在这两个数范围中,则直接返回false,否则接着递归便可。

bool CheckBST(TreeNode *root,int min, int max){if(root == NULL)return true;if(root->val < min || root->val > max)return false;return CheckBST(root->left,min,root->val)&& CheckBST(root->right,root->val,max);}bool CheckBST(TreeNode *root){if(root == NULL)return true;int min = -10000000;int max = 100000000;return CheckBST(root,min,max);}

测试代码:

void test(){TreeNode *p1 = new TreeNode(5);TreeNode *p2 = new TreeNode(4);TreeNode *p3 = new TreeNode(10);TreeNode *p4 = new TreeNode(3);TreeNode *p5 = new TreeNode(8);TreeNode *p6 = new TreeNode(12);p1->left = p2;p1->right = p3;p2->left = p4;p3->left = p5;p3->right = p6;cout << CheckBST(p1) <<endl;;}int main(){test();cout << "hello..."<<endl;return 0;}








0 0