Java&C++题解与拓展——leetcode998.最大二叉树 II【么的新知识】

56 阅读2分钟
每日一题做题记录,参考官方和三叶的题解

题目要求

image.png

image.png

  • 举的几个例子就不截了、对理解帮助不大……还不如去看看前置的那道I来得方便。

思路:模拟

  • 题目的构造思路略略有点不好理解……大概是因为没有认真做前置的题I【前面那道可以用线段树或者分治做后面补线段树类的时候可以补一下】
  • 题目中Construct()的意思是把这棵树输出为一个序列,顺序是每行依次从左到右。
    • 根据构造规则可以看出,序号在后面的节点一定靠右,所以被添加到序列末尾的valval构成的节点一定是右子节点或只有左子树的根。
    • 根据两种情况判断如何构造当前树:
      • 最大就做根,原根作为其左子树;
      • 否则就找第一个小于它的值,替代其位置并将其挂在左边(因为它序号大所以不会有右子树)。

Java

class Solution {
    public TreeNode insertIntoMaxTree(TreeNode root, int val) {
        TreeNode node = new TreeNode(val);
        TreeNode pre = null, cur = root;
        while (cur != null && cur.val > val) {  // 找第一个小于val的值
            pre = cur;
            cur = cur.right; // 只会在右边,所以只遍历右边就好了
        }
        if (pre == null) { // val最大,直接做根,原根挂左边
            node.left = cur;
            return node;
        }
        else { // 挂目标父节点右边,目标挂其左边
            pre.right = node;
            node.left = cur;
            return root;
        }
    }
}
  • 时间复杂度:O(n)O(n),最坏情况要遍历整棵树找目标节点
  • 空间复杂度:O(1)O(1)

C++

class Solution {
public:
    TreeNode* insertIntoMaxTree(TreeNode* root, int val) {
        TreeNode* node = new TreeNode(val,nullptr, nullptr);
        TreeNode* pre = nullptr;
        TreeNode* cur = root;
        while (cur && cur->val > val) { // 找第一个小于val的值
            pre = cur;
            cur = cur->right; // 只会在右边,所以只遍历右边就好了
        }
        if (!pre) { // val最大,直接做根,原根挂左边
            node->left = cur;
            return node;
        }
        else { // 挂目标父节点右边,目标挂其左边
            pre->right = node;
            node->left = cur;
            return root;
        }
    }
};
  • 时间复杂度:O(n)O(n),最坏情况要遍历整棵树找目标节点
  • 空间复杂度:O(1)O(1)

Rust

  • 这个是参考了一个递归的思路,用递归找目标插入位置。
use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn insert_into_max_tree(root: Option<Rc<RefCell<TreeNode>>>, val: i32) -> Option<Rc<RefCell<TreeNode>>> {
        if root.is_some() && root.as_ref().unwrap().borrow().val > val {
            let right = root.as_ref().unwrap().borrow().right.clone();
            root.as_ref().unwrap().borrow_mut().right = Self::insert_into_max_tree(right, val);
            root
        }
        else {
            let mut node = TreeNode::new(val);
            node.left = root;
            Some(Rc::new(RefCell::new(node)))
        }
    }
}
  • 时间复杂度:O(n)O(n),最坏情况要遍历整棵树找目标节点
  • 空间复杂度:O(1)O(1)

总结

题目理解了半天,没看懂Construct()函数的意义,不能有右子树的点很重要,抓准了就是简单模拟题。

【前置题也很有的搞,下次就搞……】


欢迎指正与讨论!