下面这道题引发了不少思考。越来也越觉得,前中后序遍历 理解 的重要性。

98. 验证二叉搜索树

基本性质,二叉搜索树的中序遍历是升序
最顺的思路就是
1)对 二叉搜索树进行 中序遍历 得到结果 ans
2)判断 ans 是否为升序
优化思路:
在 1)中序遍历过程中,就顺带判断中序遍历的结果

1.标准中序

  1. var isValidBST = function(root) {
  2. let ans = [];
  3. function dfs(node) { // 有两种思路理解这段代码:1)递归思路,2)遍历思路
  4. if (!node) {
  5. return;
  6. }
  7. dfs(node.left);
  8. ans.push(node.val);
  9. dfs(node.right);
  10. }
  11. dfs(root);
  12. console.log(ans);
  13. }

判断 数列递增 很简单,这里不写了。

2. 优化

  1. var isValidBST = function(root) {
  2. let is = true;
  3. let ans = [];
  4. function dfs(node) { // 有两种思路理解这段代码:1)递归思路,2)遍历思路
  5. if (!node) {
  6. return;
  7. }
  8. if (!is) {
  9. return;
  10. }
  11. dfs(node.left);
  12. if (node.val <= ans[ans.length - 1]) {
  13. is = false;
  14. return;
  15. }
  16. ans.push(node.val);
  17. dfs(node.right);
  18. }
  19. dfs(root);
  20. return is;
  21. }

3.去掉数组

  1. var isValidBST = function(root) {
  2. let is = true;
  3. // let ans = [];
  4. let pre = -Infinity;
  5. function dfs(node) { // 有两种思路理解这段代码:1)递归思路,2)遍历思路
  6. if (!node) {
  7. return;
  8. }
  9. if (!is) {
  10. return;
  11. }
  12. dfs(node.left);
  13. if (node.val <= pre) { // 这里决定了pre初始化的值
  14. is = false;
  15. return;
  16. }
  17. pre = node.val;
  18. dfs(node.right);
  19. }
  20. dfs(root);
  21. return is;
  22. }