623.在二叉树中增加一行

This commit is contained in:
游由 2022-08-05 16:48:24 +08:00
parent cae5428c7a
commit d448d45f07
2 changed files with 139 additions and 0 deletions

View File

@ -125,6 +125,7 @@ mod q0575;
mod q0598;
mod q0605;
mod q0617;
mod q0623;
mod q0628;
mod q0633;
mod q0643;

View File

@ -0,0 +1,138 @@
use crate::Solution;
use std::rc::Rc;
use std::cell::RefCell;
use std::cmp::Ordering;
use crate::structure::TreeNode;
impl Solution {
/// [623.在二叉树中增加一行](https://leetcode.cn/problems/add-one-row-to-tree/)
///
/// 2022-08-05 15:51:39
///
/// 给定一个二叉树的根 `root` 和两个整数 `val` 和 `depth` ,在给定的深度 `depth` 处添加一个值为 `val` 的节点行。
///
/// 注意,根节点 `root` 位于深度 `1` 。
///
/// + 加法规则如下:
/// * 给定整数 `depth`,对于深度为 `depth - 1` 的每个非空树节点 `cur` ,创建两个值为 `val` 的树节点作为 `cur` 的左子树根和右子树根。
/// * `cur` 原来的左子树应该是新的左子树根的左子树。
/// * `cur` 原来的右子树应该是新的右子树根的右子树。
/// * 如果 `depth == 1` 意味着 `depth - 1` 根本没有深度,那么创建一个树节点,值 `val` 作为整个原始树的新根,而原始树就是新根的左子树。
/// + **示例 1:**
/// + ![](https://assets.leetcode.com/uploads/2021/03/15/addrow-tree.jpg)
/// + **输入:** root = \[4,2,6,3,1,5\], val = 1, depth = 2
/// + **输出:** \[4,1,1,2,null,null,6,3,1,5\]
/// + **示例 2:**
/// + ![](https://assets.leetcode.com/uploads/2021/03/11/add2-tree.jpg)
/// + **输入:** root = \[4,2,null,3,1\], val = 1, depth = 3
/// + **输出:** \[4,2,null,1,1,3,null,null,1\]
/// + **提示:**
/// * 节点数在 `[1, 104]` 范围内
/// * 树的深度在 `[1, 104]`范围内
/// * `-100 <= Node.val <= 100`
/// * `-105 <= val <= 105`
/// * `1 <= depth <= the depth of tree + 1`
/// + Related Topics
/// * 树
/// * 深度优先搜索
/// * 广度优先搜索
/// * 二叉树
/// * 👍 167
/// * 👎 0
pub fn add_one_row(root: Option<Rc<RefCell<TreeNode>>>, val: i32, depth: i32) -> Option<Rc<RefCell<TreeNode>>> {
fn add_one_row_recursion(mut node: Option<Rc<RefCell<TreeNode>>>, curr_depth: i32, val: i32, depth: i32) -> Option<Rc<RefCell<TreeNode>>> {
match curr_depth.cmp(&depth) {
Ordering::Less => match node {
Some(mut n) => match n.borrow_mut() {
mut p => Some(Rc::new(RefCell::new(TreeNode {
val: p.val,
left: add_one_row_recursion(p.left.take(), curr_depth + 1, val, depth),
right: add_one_row_recursion(p.right.take(), curr_depth + 1, val, depth),
})))
},
_ => None
}
Ordering::Equal => match node {
Some(mut n) => match n.borrow_mut() {
mut p => Some(Rc::new(RefCell::new(TreeNode {
val: p.val,
left: Some(Rc::new(RefCell::new(TreeNode {
val,
left: p.left.take(),
right: None,
}))),
right: Some(Rc::new(RefCell::new(TreeNode {
val,
left: None,
right: p.right.take(),
}))),
})))
},
_ => None
}
_ => Some(Rc::new(RefCell::new(TreeNode {
val,
left: node,
right: None,
})))
}
}
add_one_row_recursion(root, 1, val, depth - 1)
}
}
#[cfg(test)]
mod test {
use crate::Solution;
use std::rc::Rc;
use std::cell::RefCell;
use crate::structure::TreeNode;
#[test]
fn test_q0623() {
let tree = Some(Rc::new(RefCell::new(TreeNode {
val: 4,
left: Some(Rc::new(RefCell::new(TreeNode {
val: 2,
left: Some(Rc::new(RefCell::new(TreeNode {
val: 3,
left: None,
right: None,
}))),
right: Some(Rc::new(RefCell::new(TreeNode {
val: 1,
left: None,
right: None,
}))),
}))),
right: None,
})));
let ans = Some(Rc::new(RefCell::new(TreeNode {
val: 4,
left: Some(Rc::new(RefCell::new(TreeNode {
val: 2,
left: Some(Rc::new(RefCell::new(TreeNode {
val: 1,
left: Some(Rc::new(RefCell::new(TreeNode {
val: 3,
left: None,
right: None,
}))),
right: None,
}))),
right: Some(Rc::new(RefCell::new(TreeNode {
val: 1,
left: None,
right: Some(Rc::new(RefCell::new(TreeNode {
val: 1,
left: None,
right: None,
}))),
}))),
}))),
right: None,
})));
assert_eq!(Solution::add_one_row(tree, 1, 3), ans);
}
}