不过夜的LeetCode22秋赛题——装饰树

76 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情


最近一直在力扣刷题,也逐渐对各类题型有了自己的理解,所谓见招拆招,将自己的浅显经验分享一下,帮助更多在编程路上的朋友们。


今天分享一下战队赛第二题,是一道非常典型的二叉树题目

2. 装饰树

力扣嘉年华上的 DIY 手工展位准备了一棵缩小版的 二叉 装饰树 root 和灯饰,你需要将灯饰逐一插入装饰树中,要求如下:

  • 完成装饰的二叉树根结点与 root 的根结点值相同

  • 若一个节点拥有父节点,则在该节点和他的父节点之间插入一个灯饰(即插入一个值为 -1 的节点)。具体地:

    • 在一个 父节点 x 与其左子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的左子节点,
    • 在一个 父节点 x 与其右子节点 y 之间添加 -1 节点, 节点 -1、节点 y 为各自父节点的右子节点,

现给定二叉树的根节点 root ,请返回完成装饰后的树的根节点。
示例 1:

image.png

示例 2:

image.png

思路

经验之谈,只要是遇到树,无非递归和迭代两种方法,我对递归比较顺手,故使用递归解决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;
    }  
}