博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode OJ:Validate Binary Search Tree(合法的二叉搜索树)
阅读量:6699 次
发布时间:2019-06-25

本文共 3742 字,大约阅读时间需要 12 分钟。

Given a binary tree, determine if it is a valid binary search tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

一开始是这样做的:

1 class Solution { 2 public: 3     bool isValidBST(TreeNode* root) { 4        return checkValid(root, INT_MIN, INT_MAX); 5     } 6  7     bool checkValid(TreeNode * root, int left, int right) 8     { 9         if(root == NULL)10             return true;11         return(root->val > left && root->val < right && checkValid(root->left, left, root->val) ]12             && checkValid(root->right, root->val, right));13     }14 };

然而并不能通过,因为leetCode增加了两个新的测试用例,把INT_MAX以及INT_MIN也囊括进去了。

那么就只好用中序遍历的方法来了(一开始想的是先中序遍历一遍,然后根据遍历的到的值是不是升序排列的来判断这个二叉树是不是BST,但是后来发现传入一个引用的参数可以实现一边递归一边比较),代码如下:

1 class Solution{ 2 public: 3     bool isValidBST(TreeNode* root) { 4         TreeNode * helper = NULL; 5         return inOrder(root, helper); 6     } 7  8     bool inOrder(TreeNode * root, TreeNode * & prev){//注意这里的是引用 9         if(root == NULL)10             return true;11         bool left = inOrder(root->left, prev);12         if(prev != NULL && prev->val >= root->val)13             return false;14         prev = root;15         bool right = inOrder(root->right, prev);16         return left && right;17     }18 };

 

当然上面的也可以采用迭代的方式来做:

1 class Solution { 2 public: 3     bool isValidBST(TreeNode* root) { 4         stack
s; 5 TreeNode * pre = NULL; 6 if(root == NULL) 7 return true; 8 while(root || !s.empty()){ 9 while(root != NULL){10 s.push(root);11 root = root->left;12 }13 14 root = s.top();15 s.pop();16 if(pre != NULL && root->val <= pre->val) return false;17 18 pre = root;19 root = root->right;20 }21 return true;22 }23 };

 

 

 

下面是java版本的代码,首先还是不可行的Integer.MAX_VALUE方法,但是还是贴下吧:

1 /** 2  * Definition for a binary tree node. 3  * public class TreeNode { 4  *     int val; 5  *     TreeNode left; 6  *     TreeNode right; 7  *     TreeNode(int x) { val = x; } 8  * } 9  */10 public class Solution {11     public boolean isValidBST(TreeNode root) {12         return checkValid(root, Integer.MIN_VALUE, Integer.MAX_VALUE);13     }14     15     boolean checkValid(TreeNode root, int left, int right){16         if(root == null)17             return true;18         if(root.val <= left || root.val >= right){19             return false;20         }21         return checkValid(root.left, left, root.val) 22             && checkValid(root.right, root.val, right);23     }24 }

那么只有遍历树了,然后来判断, 这里使用非递归的方法来写:

1 public class Solution { 2     public boolean isValidBST(TreeNode root) { 3         Stack
stack = new Stack
(); 4 HashMap
map = new HashMap
(); 5 List
list = new ArrayList
(); 6 if(root == null) 7 return true; 8 stack.push(root); 9 while(!stack.isEmpty()){10 TreeNode node = stack.peek();11 while(node.left != null && !map.containsKey(node.left)){12 stack.push(node.left);13 map.put(node.left, 1);14 node = node.left;15 }16 stack.pop();17 list.add(node.val);18 if(node.right != null && !map.containsKey(node.right)){19 stack.push(node.right);20 map.put(node.right, 1);21 }22 }23 for(int i = 0; i < list.size() - 1; ++i){24 if(list.get(i) >= list.get(i+1))25 return false;26 }27 return true;28 }29 }

 

转载于:https://www.cnblogs.com/-wang-cheng/p/4908685.html

你可能感兴趣的文章
easymybatis中字段自动填充
查看>>
java 电子商务云平台b2b b2c o2o springmvc+mybatis+spring cloud+spring boot
查看>>
如何通过ad组策略让domain users用户可以远程桌面?
查看>>
线程池的使用
查看>>
vb的winio模拟键盘鼠标部分参考代码
查看>>
等待多个并发事件完成的模型
查看>>
如何使用 PyCharm+Docker 打造深度学习利器
查看>>
十大压力测试工具,收下
查看>>
Maven学习总结(八)——使用Maven构建多模块项目
查看>>
易宝典文章——怎样管理Exchange Server 2013邮箱邮件流功能之传递选项
查看>>
Interested Transaction List ( ITL ) in Oracle
查看>>
Centos 6.3 install Darwin Streaming Server 6.0.3
查看>>
个人博客的推广
查看>>
VUE页面渲染问题
查看>>
浮点型
查看>>
81.node.js前端html时页面格式错乱解决办法
查看>>
this与super关键字
查看>>
Word 2010 插入其他文件的方法
查看>>
BZOJ4766: 文艺计算姬(Prufer序列)
查看>>
ECMAScript 5 —— 单体内置对象之Global对象
查看>>