[leetcode] 655. Print Binary Tree @ python

版权声明:版权归个人所有,未经博主允许,禁止转载 https://blog.csdn.net/danspace1/article/details/86605281

原题

Print a binary tree in an m*n 2D string array following these rules:

The row number m should be equal to the height of the given binary tree.
The column number n should always be an odd number.
The root node’s value (in string format) should be put in the exactly middle of the first row it can be put. The column and the row where the root node belongs will separate the rest space into two parts (left-bottom part and right-bottom part). You should print the left subtree in the left-bottom part and print the right subtree in the right-bottom part. The left-bottom part and the right-bottom part should have the same size. Even if one subtree is none while the other is not, you don’t need to print anything for the none subtree but still need to leave the space as large as that for the other subtree. However, if two subtrees are none, then you don’t need to leave space for both of them.
Each unused space should contain an empty string “”.
Print the subtrees following the same rules.
Example 1:
Input:
1
/
2
Output:
[["", “1”, “”],
[“2”, “”, “”]]
Example 2:
Input:
1
/
2 3

4
Output:
[["", “”, “”, “1”, “”, “”, “”],
["", “2”, “”, “”, “”, “3”, “”],
["", “”, “4”, “”, “”, “”, “”]]
Example 3:
Input:
1
/
2 5
/
3
/
4
Output:

[["", “”, “”, “”, “”, “”, “”, “1”, “”, “”, “”, “”, “”, “”, “”]
["", “”, “”, “2”, “”, “”, “”, “”, “”, “”, “”, “5”, “”, “”, “”]
["", “3”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”]
[“4”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”]]

解法

观察数组可得, 数组的长度是二叉树的高度, 子数组的长度是2**h-1. 因此定义depth函数求二叉树的高度, 并初始化res列表. 接下来是更新res的值, 使用递归, base case是当节点为空时, 返回res. 然后每次递归根据左边和右边的index来求中间的index, 节点放在中间. 如此递归.
Time: O(h*h), h为树的高度
Space: O(1)

代码

class Solution:
    def printTree(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[str]]
        """
        def height(root):
            if not root:
                return 0
            return 1 + max(height(root.left), height(root.right))
        
        def update(node, left, right, row, res):
            if not node:
                return 
            mid = (left + right)//2
            res[row][mid] = str(node.val)
            if node.left:
                update(node.left, left, mid-1, row+1, res)
            if node.right:
                update(node.right, mid+1, right, row+1, res)
                
        h = height(root)
        w = 2**h - 1
        res = [['']*w for i in range(h)]
        update(root, 0, w-1, 0, res)
        return res

猜你喜欢

转载自blog.csdn.net/danspace1/article/details/86605281