yankewei / LeetCode

LeetCode 问题的解决方法
MIT License
6 stars 0 forks source link

在二叉树中增加一行 #151

Open yankewei opened 2 years ago

yankewei commented 2 years ago

给定一个二叉树的根 root 和两个整数 val 和 depth ,在给定的深度 depth 处添加一个值为 val 的节点行。

注意,根节点 root 位于深度 1 。

加法规则如下:

示例 1:

示例1

输入: root = [4,2,6,3,1,5], val = 1, depth = 2
输出: [4,1,1,2,null,null,6,3,1,5]

示例 2:

示例2

输入: root = [4,2,null,3,1], val = 1, depth = 3
输出:  [4,2,null,1,1,3,null,null,1]

提示:

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/add-one-row-to-tree 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

yankewei commented 2 years ago

比较简单的树遍历,可以借助 php 的匿名函数递归 https://github.com/yankewei/blog/issues/8

/**
 * Definition for a binary tree node.
 * class TreeNode {
 *     public $val = null;
 *     public $left = null;
 *     public $right = null;
 *     function __construct($val = 0, $left = null, $right = null) {
 *         $this->val = $val;
 *         $this->left = $left;
 *         $this->right = $right;
 *     }
 * }
 */
class Solution {

    /**
     * @param TreeNode $root
     * @param Integer $val
     * @param Integer $depth
     * @return TreeNode
     */
    function addOneRow($root, $val, $depth) {
        if ($depth === 1) {
            return new TreeNode($val, $root, null);
        }

        $dfs = function (?TreeNode $root, int $level) use (&$dfs, $val, $depth){
            if ($level === $depth-1) {
                $root->left = new TreeNode($val, $root->left, null);
                $root->right = new TreeNode($val, null, $root->right);
                return;
            }

            if ($root->left !== null) {
                $dfs($root->left, $level + 1);
            }

            if ($root->right !== null) {
                $dfs($root->right, $level + 1);
            }
        };

        $dfs($root, 1); // level 设置为1,为了获取正确的节点

        return $root;
    }
}