验证二叉搜索树 - 验证二叉搜索树 - 力扣(LeetCode)
中序遍历,两个版本
public boolean isValidBST(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
double pre = -Double.MAX_VALUE;
while (!stack.isEmpty()||root!=null){
while (root!=null){
stack.push(root);
root = root.left;
}
root = stack.pop();
//进行判断
if (root.val <= pre)
return false;
pre = root.val;
root = root.right;
}
return true;
}
递归版
class Solution {
double pre = -Double.MAX_VALUE;
public boolean isValidBST(TreeNode root) {
return isture(root);
}
public boolean isture (TreeNode root){
if (root == null)
return true;
//先遍历左子树
boolean a = isture(root.left);
//访问中间节点
if (root.val <= pre)
return false;
pre = root.val;
//访问右子树
boolean b= isture(root.right);
//访问完毕,如果都为真则直接返回
return a&&b;
}
}
采用后序遍历
class Solution {
Map<TreeNode, Integer> f = new HashMap<TreeNode, Integer>();
Map<TreeNode, Integer> g = new HashMap<TreeNode, Integer>();
public int rob(TreeNode root) {
dfs(root);
return Math.max(f.getOrDefault(root, 0), g.getOrDefault(root, 0));
}
public void dfs(TreeNode node) {
if (node == null) {
return;
}
dfs(node.left);
dfs(node.right);
f.put(node, node.val + g.getOrDefault(node.left, 0) + g.getOrDefault(node.right, 0));
g.put(node, Math.max(f.getOrDefault(node.left, 0), g.getOrDefault(node.left, 0)) + Math.max(f.getOrDefault(node.right, 0), g.getOrDefault(node.right, 0)));
}
}