二叉搜索树|不同、验证、转换等
文章目录
- 二叉搜索树|不同、验证、转换等
- [96 不同的二叉搜索树](https://leetcode.cn/problems/unique-binary-search-trees/description/)
- [98 验证二叉搜索树](https://leetcode.cn/problems/validate-binary-search-tree/description/)
- [538 把二叉搜索树转换为累加树](https://leetcode.cn/problems/convert-bst-to-greater-tree/description/)

- 参考力扣官方题解,链接:https://leetcode.cn/problems/unique-binary-search-trees/solutions/329807/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/
- G(n) = sum(G(i-1)·G(n-i))
- G(2)=G(0)·G(1)+G(1)·G(0)
- G(3)=G(0)·G(2)+G(1)·G(1)+G(2)·G(0)

public class $96 {public int numTrees(int n) {int[] G = new int[n+1];G[0] = 1;G[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i; j++) {G[i] += G[j-1] * G[i-j];}}return G[n];}
}


import java.util.Stack;
public class $98 {public boolean isValidBST(TreeNode root) {return process(root, Long.MIN_VALUE, Long.MAX_VALUE);}private boolean process(TreeNode node, long lower, long upper) {if (node == null) {return true;}if (node.val <= lower || node.val >= upper) {return false;}return process(node.left, lower, node.val) && process(node.right, node.val, upper);}
}
import java.util.Stack;
public class $98 {public boolean isValidBST2(TreeNode root) {Stack<TreeNode> stack = new Stack<>();TreeNode cur = root;double prev = -Double.MAX_VALUE;while (true) {while (cur != null) {stack.push(cur);cur = cur.left;}if (stack.isEmpty()) {break;}TreeNode tmp = stack.pop();if (tmp.val <= prev) return false;prev = tmp.val;cur = tmp.right;}return true;}
}


- 法一:递归,右中左遍历
- 法二:morris反序中序遍历
public class $538 {int sum = 0;public TreeNode convertBST(TreeNode root) {if (root == null) {return null;}convertBST(root.right);sum += root.val;root.val = sum;convertBST(root.left);return root;}
}
public class $538 {public TreeNode convertBST2(TreeNode root) {int sum = 0;TreeNode cur = root;TreeNode prev = null;while (cur != null) {prev = cur.right;if (prev != null) {while (prev.left != null && prev.left != cur) {prev = prev.left;}if (prev.left == null) {prev.left = cur;cur = cur.right;} else {prev.left = null;sum += cur.val;cur.val = sum;cur = cur.left;}} else {sum += cur.val;cur.val = sum;cur = cur.left;}}return root;}}