持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
最近一直在力扣刷题,也逐渐对各类题型有了自己的理解,所谓见招拆招,将自己的浅显经验分享一下,帮助更多在编程路上的朋友们。
今天分享一下战队赛第二题,是一道非常典型的二叉树题目
2. 装饰树
力扣嘉年华上的 DIY 手工展位准备了一棵缩小版的 二叉 装饰树 root 和灯饰,你需要将灯饰逐一插入装饰树中,要求如下:
-
完成装饰的二叉树根结点与
root的根结点值相同 -
若一个节点拥有父节点,则在该节点和他的父节点之间插入一个灯饰(即插入一个值为
-1的节点)。具体地:- 在一个 父节点 x 与其左子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的左子节点,
- 在一个 父节点 x 与其右子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的右子节点,
现给定二叉树的根节点 root ,请返回完成装饰后的树的根节点。
示例 1:
示例 2:
思路
经验之谈,只要是遇到树,无非递归和迭代两种方法,我对递归比较顺手,故使用递归解决T_T
递归只需要想好几种情况:
- 节点是否为空
- 节点是否为叶节点
- 节点如何处理左右子节点
然后递归调用子节点,重复处理以上流程。
题解
class Solution {
public TreeNode expandBinaryTree(TreeNode root) {
//节点为空,直接返回;节点为叶节点,无需操作,直接返回
if(root == null || (root.left == null && root.right == null)) {
return root;
}
if(root.left != null) {
TreeNode tmp = expandBinaryTree(root.left);//左孩子节点递归执行该函数,进行同样的处理
root.left = new TreeNode(-1);
root.left.left = tmp;
}
if(root.right != null) {
TreeNode tmp = expandBinaryTree(root.right);//右孩子节点递归执行
root.right = new TreeNode(-1);
root.right.right = tmp;
}
//所有子节点处理完毕,返回根节点
return root;
}
}