博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode: Validate Binary Search Tree
阅读量:5057 次
发布时间:2019-06-12

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

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

我想到了用中序遍历,保存到一个数组中,再检查数组是否是有序的。但是我需要O(n)的额外空间保存这个数组。

网上看到一种和这个一样的方法,但是不需要额外空间,但是没太看懂。

1 public static boolean isValidBST(TreeNode root) { 2         ArrayList
list = new ArrayList
(); 3 traverse(root, list); 4 5 for (int i=0; i
= list.get(i+1)) { 7 return false; 8 } 9 }10 11 return true;12 }13 14 public static void traverse (TreeNode root, ArrayList
list) { 15 if (root != null) {16 traverse(root.left, list);17 list.add(root.val);18 traverse(root.right, list);19 }20 }

 

1 bool isBSTInOrderHelper(BinaryTree *p, int& prev) { 2   if (!p) return true; 3   if (isBSTInOrderHelper(p->left, prev)) { 4     if (p->data > prev) { 5       prev = p->data; 6       return isBSTInOrderHelper(p->right, prev); 7     } else { 8       return false; 9     }10   }11   else {12     return false;13   }14 }

 

另外一种不需要额外空间的方法是确定每个元素的范围,然后检查这个元素是否在范围内。

递归判断,递归时传入两个参数,一个是左界,一个是右界,节点的值必须在两个界的中间,同时在判断做子树和右子树时更新左右界。

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

 

转载于:https://www.cnblogs.com/longhorn/p/3603015.html

你可能感兴趣的文章
BZOJ 1010 [HNOI2008]玩具装箱 (斜率优化DP)
查看>>
java-动态规划算法学习笔记
查看>>
STL容器之vector
查看>>
Linux 内核中断内幕
查看>>
DNS负载均衡
查看>>
无法向会话状态服务器发出会话状态请求
查看>>
数据中心虚拟化技术
查看>>
Oracle OEM 配置报错: No value was set for the parameter DBCONTROL_HTTP_PORT 解决方法
查看>>
01入门
查看>>
python正则表达式
查看>>
嵌套循环连接(nested loops join)原理
查看>>
shell统计特征数量
查看>>
复习文件操作
查看>>
C#Hashtable与Dictionary性能
查看>>
10个让你忘记 Flash 的 HTML5 应用演示
查看>>
8个Python面试必考的题目,小编也被坑过 ToT
查看>>
SQL Server 使用作业设置定时任务之一(转载)
查看>>
centos 图形界面和命令行界面切换(转载)
查看>>
Maven启用代理访问
查看>>
Primary definition
查看>>