本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
今天给大家分享的题目是根据二叉树创建字符串。
二、思路分析:
乍一看还挺复杂,但是遇到树的题目,直接递归返回就完事了。
递归
-
我们还是从最底层的叶子节点开始往上考虑,考虑每个节点能够提供给父节点的收益是什么,有多少。这里我们定义每个节点返回给其父亲节点的收益是""。
-
对于每个叶子节点,因为其左右孩子都是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}";
}
四、总结:
二叉树的题目,递归即可。递归需要考虑递归的结束条件和递归的返回,返回可以理解为子节点能给父节点提供的收益,一般对照着题目的要求,在纸上简单的画一下,就能得出。本题比较特殊的情况是左子树为空,右子树存在的时候特殊处理了一下。