1.二叉树的最大深度

image.png

1.1解答

image.png

  1. public int maxDepth(TreeNode root) {
  2. return root==null?0:Math.max(maxDepth(root.left),maxDepth(root.right))+1;
  3. }

2.验证二叉搜索树

image.png
前置知识:
image.png
中序遍历实现:

  1. //使用中序遍历,获取整个树中的所有键
  2. public Queue<Key> midErgodic(){
  3. Queue<Key> keys = new Queue<>();
  4. midErgodic(root,keys);
  5. return keys;
  6. }
  7. //使用中序遍历,把指定树x中的所有键放入到keys队列中
  8. private void midErgodic(Node x,Queue<Key> keys){
  9. if (x==null){
  10. return;
  11. }
  12. //1.找到当前结点的左子树,如果不为空,递归遍历左子树
  13. if (x.left!=null){
  14. midErgodic(x.left,keys);
  15. }
  16. //2.把当前结点的key放入到队列中;
  17. keys.enqueue(x.key);
  18. //3.找到当前结点的右子树,如果不为空,递归遍历右子树
  19. if (x.right!=null){
  20. midErgodic(x.right,keys);
  21. }
  22. }

2.1递归实现√

  1. public boolean isValidBST(TreeNode root) {
  2. return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE);
  3. }
  4. public boolean isValidBST(TreeNode root, long minVal, long maxVal) {
  5. if (root == null)
  6. return true;
  7. //每个节点如果超过这个范围,直接返回false
  8. if (root.val >= maxVal || root.val <= minVal)
  9. return false;
  10. //这里再分别以左右两个子节点分别判断,
  11. //左子树范围的最小值是minVal,最大值是当前节点的值,也就是root的值,因为左子树的值要比当前节点小
  12. //右子数范围的最大值是maxVal,最小值是当前节点的值,也就是root的值,因为右子树的值要比当前节点大
  13. return isValidBST(root.left, minVal, root.val) && isValidBST(root.right, root.val, maxVal);
  14. }

2.2中序遍历实现√

  1. class Solution {
  2. //前一个结点,全局的
  3. TreeNode prev;
  4. public boolean isValidBST(TreeNode root) {
  5. if (root == null)
  6. return true;
  7. //访问左子树
  8. if (!isValidBST(root.left))
  9. return false;
  10. //访问当前节点:如果当前节点小于等于中序遍历的前一个节点直接返回false。
  11. if (prev != null && prev.val >= root.val)
  12. return false;
  13. prev = root;
  14. //访问右子树
  15. if (!isValidBST(root.right))
  16. return false;
  17. return true;
  18. }
  19. }