二叉树的相关知识有点忘了,补了一下,链接如下:
说回这个题,这个题乍一看不难,二叉树相关的题最明显的思路就是递归求解,装饰树有几种情况:
1. 全为空,返回None即可;
2. 只有根节点,返回根节点即可;
3. 根节点root有左子节点(左子节点和右子节点分开讨论),将root的左子节点指向新生成的节点-1,原先的root节点的左子节点变成了现在的root节点的左子节点的左子节点,而这个左子节点也有几种情况可以讨论(仅讨论左边,右边的情况一会说),也就是我们分析的【2,3】,因此这次很自然地想到可以递归,调用函数本身,这个root节点的左子节点的左子节点变成了新的root,如果是只有它本身就是【2】的情况,如果是它还有其他的左子节点就继续递归,也就是再调用函数本身,情况【3】。
4. 右子节点的情况和左子节点一样,只是一个left一个right,不再赘述。
代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def expandBinaryTree(self, root):
"""
:type root: Optional[TreeNode]
:rtype: Optional[TreeNode]
"""
if not root:
return None
if not root.left and not root.right:
return root
if root.left:
tmp = root.left
newnode = TreeNode(-1)
root.left = newnode
root.left.left = self.expandBinaryTree(tmp)
if root.right:
tmp = root.right
newnode = TreeNode(-1)
root.right = newnode
root.right.right = self.expandBinaryTree(tmp)
return root