根据二叉树创建字符串 | 刷题打卡

152 阅读2分钟

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

image.png

image.png

今天给大家分享的题目是根据二叉树创建字符串。

二、思路分析:

乍一看还挺复杂,但是遇到树的题目,直接递归返回就完事了。

递归

  • 我们还是从最底层的叶子节点开始往上考虑,考虑每个节点能够提供给父节点的收益是什么,有多少。这里我们定义每个节点返回给其父亲节点的收益是""。

  • 对于每个叶子节点,因为其左右孩子都是NULL,相当于左右孩子给她的收益是"",所以递归的返回是root == null时返回""。那么叶子节点能提供给父节点的收益就是叶子值。通过观察题目示例,对于一个非叶子节点,其返回给父亲的收益应该是root值(左子树串)(右子树串), 所以我们递归函数里返回的也应该是: root->val + $left + $right; 唯一需要注意的地方是在计算左子树收益的时候,需要判断一下右子树是否存在的情况,右子树存在的时候,左子树的收益是()。就是示例2中的情况。

  • 时间复杂度:O(N),这里 N 二叉树中节点的个数。

  • 空间复杂度:O(H),H是二叉树的高度。

三、AC 代码:

function tree2str($t) {
        return $this->help($t);
    }

    protected function help($t)
    {
        if ($t == null) {
            return "";
        }
        $left = $this->help($t->left);
        $right = $this->help($t->right);
        $leftGain = $t->left ? "({$left})" : "";
        if ($leftGain == "" && $t->right) {
            $leftGain = "()";
        }
        $rightGain = $t->right ? "({$right})" : "";
        return "{$t->val}{$leftGain}{$rightGain}";
    }

四、总结:

二叉树的题目,递归即可。递归需要考虑递归的结束条件和递归的返回,返回可以理解为子节点能给父节点提供的收益,一般对照着题目的要求,在纸上简单的画一下,就能得出。本题比较特殊的情况是左子树为空,右子树存在的时候特殊处理了一下。