【算法刷题day20】Leetcode:654. 最大二叉树、617.合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树

2024-04-14 1925阅读

文章目录

    • Leetcode 654. 最大二叉树
      • 解题思路
      • 代码
      • 总结
      • Leetcode 617.合并二叉树
        • 解题思路
        • 代码
        • 总结
        • Leetcode 700. 二叉搜索树中的搜索
          • 解题思路
          • 代码
          • 总结
          • Leetcode 98.验证二叉搜索树
            • 解题思路
            • 代码
            • 总结

              草稿图index.php/tags-333.html" class="superseo">网站

              【算法刷题day20】Leetcode:654. 最大二叉树、617.合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树 第1张
              ()

              java的Deque

              Leetcode 654. 最大二叉树

              题目:654. 最大二叉树

              【算法刷题day20】Leetcode:654. 最大二叉树、617.合并二叉树、700. 二叉搜索树中的搜索、98.验证二叉搜索树 第2张
              ()

              解析:代码随想录解析

              解题思路

              NLR的建树

              代码

              /**
               * Definition for a binary tree node.
               * public class TreeNode {
               *     int val;
               *     TreeNode left;
               *     TreeNode right;
               *     TreeNode() {}
               *     TreeNode(int val) { this.val = val; }
               *     TreeNode(int val, TreeNode left, TreeNode right) {
               *         this.val = val;
               *         this.left = left;
               *         this.right = right;
               *     }
               * }
               */
              class Solution {
                  public TreeNode constructMaximumBinaryTree(int[] nums) {
                      return buildTree(nums, 0, nums.length);
                  }
                  private TreeNode buildTree(int[] nums, int left, int right) {
                      if (left == right)
                          return null;
                      if (left + 1 == right)
                          return new TreeNode(nums[left]);
                      int mid = left;
                      int midNum = nums[left];
                      for (int i = left + 1; i  midNum){
                              midNum = nums[i];
                              mid = i;
                          }
                      }
                      TreeNode newNode = new TreeNode(midNum);
                      newNode.left = buildTree(nums, left, mid);
                      newNode.right = buildTree(nums, mid + 1, right);
                      return newNode;
                  }
              }
              

              总结

              暂无

              Leetcode 617.合并二叉树

              题目:617.合并二叉树

              解析:代码随想录解析

              解题思路

              如果都为root1, root2都为空,返回null;如果root1为空,root2不为空,返回root2;如果roo1不为空,root2为空,返回root1,否则创建新节点,递归。

              改进:以root1为主树,并对判断条件减枝。

              代码

              /**
               * Definition for a binary tree node.
               * public class TreeNode {
               *     int val;
               *     TreeNode left;
               *     TreeNode right;
               *     TreeNode() {}
               *     TreeNode(int val) { this.val = val; }
               *     TreeNode(int val, TreeNode left, TreeNode right) {
               *         this.val = val;
               *         this.left = left;
               *         this.right = right;
               *     }
               * }
               */
              class Solution {
                  public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
                      if (root1 == null && root2 == null)
                          return null;
                      else if (root1 != null && root2 == null)
                          return root1;
                      else if (root1 == null && root2 != null)
                          return root2;
                      else {
                          TreeNode newNode = new TreeNode(root1.val + root2.val);
                          newNode.left = mergeTrees(root1.left, root2.left);
                          newNode.right = mergeTrees(root1.right, root2.right);
                          return newNode;
                      }
                  }
              }
              //改进,减少了一点点内存消耗
              class Solution {
                  public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
                      if (root1 == null)  return root2;
                      if (root2 == null)  return root1;
                      root1.val = root1.val + root2.val;
                      root1.left = mergeTrees(root1.left, root2.left);
                      root1.right = mergeTrees(root1.right, root2.right);
                      return root1;
                  }
              }
              //前序遍历
              class Solution {
                  public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
                      if (root1 == null)  return root2;
                      if (root2 == null)  return root1;
                      Stack stack = new Stack();
                      stack.push(root2);
                      stack.push(root1);
                      while (!stack.isEmpty()) {
                          TreeNode node1 = stack.pop();
                          TreeNode node2 = stack.pop();
                          node1.val += node2.val;
                          if (node1.right != null && node2.right != null){
                              stack.push(node2.right);
                              stack.push(node1.right);
                          } else {
                              if (node1.right == null)
                                  node1.right = node2.right;
                          }
                          if (node1.left != null && node2.left != null) {
                              stack.push(node2.left);
                              stack.push(node1.left);
                          }else {
                              if (node1.left == null)
                                  node1.left = node2.left;
                          }
                      }
                      return root1;
                  }
              }
              //层序遍历
              class Solution {
                  public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
                      if (root1 == null)  return root2;
                      if (root2 == null)  return root1;
                      Queue queue = new LinkedList();
                      queue.add(root1);
                      queue.add(root2);
                      while (!queue.isEmpty()) {
                          TreeNode node1 = queue.poll();
                          TreeNode node2 = queue.poll();
                          node1.val += node2.val;
                          if (node1.left != null && node2.left != null) {
                              queue.add(node1.left);
                              queue.add(node2.left);
                          }else {
                              if (node1.left == null)
                                  node1.left = node2.left;
                          }
                          if (node1.right != null && node2.right != null){
                              queue.add(node1.right);
                              queue.add(node2.right);
                          } else {
                              if (node1.right == null)
                                  node1.right = node2.right;
                          }
                      }
                      return root1;
                  }
              }
              

              总结

              暂无

              Leetcode 700. 二叉搜索树中的搜索

              题目:700. 二叉搜索树中的搜索

              解析:代码随想录解析

              解题思路

              代码

              /**
               * Definition for a binary tree node.
               * public class TreeNode {
               *     int val;
               *     TreeNode left;
               *     TreeNode right;
               *     TreeNode() {}
               *     TreeNode(int val) { this.val = val; }
               *     TreeNode(int val, TreeNode left, TreeNode right) {
               *         this.val = val;
               *         this.left = left;
               *         this.right = right;
               *     }
               * }
               */
              class Solution {
                  public TreeNode searchBST(TreeNode root, int val) {
                      if (root == null || root.val == val)
                         return root;
                      if (root.val  val)
                          return searchBST(root.left, val);
                      return null;
                  }
              }
              //不递归直接搜
              class Solution {
                  public TreeNode searchBST(TreeNode root, int val) {
                      while (root != null) {
                          if (val  root.val) root = root.right;
                          else return root;
                      }
                      return null;
                  }
              }
              

              总结

              暂无

              Leetcode 98.验证二叉搜索树

              题目:98.验证二叉搜索树

              解析:代码随想录解析

              解题思路

              中序遍历,记录上一个节点的值和现在的比,如果遍历完就返回true。

              代码

              /**
               * Definition for a binary tree node.
               * public class TreeNode {
               *     int val;
               *     TreeNode left;
               *     TreeNode right;
               *     TreeNode() {}
               *     TreeNode(int val) { this.val = val; }
               *     TreeNode(int val, TreeNode left, TreeNode right) {
               *         this.val = val;
               *         this.left = left;
               *         this.right = right;
               *     }
               * }
               */
              class Solution {
                  private int pre = Integer.MIN_VALUE;
                  public boolean isValidBST(TreeNode root) {
                      if (root == null)
                          return true;
                      if (!isValidBST(root.left))
                          return false;
                      if (root.val 
                  public boolean isValidBST(TreeNode root) {
                      if (root == null)
                          return true;
                      Stack
                          while (root != null) {
                              stack.push(root);
                              root = root.left;
                          }
                          TreeNode node = stack.pop();
                          if (pre != null && pre.val = node.val)
                              return false;
                          pre = node;
                          node = node.right;
                      }
                      return true;
                  }
              }
              

              总结

              暂无


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]