LeetCode 0545. Boundary of Binary Tree Solution in Java, C++, Python & More | Explanation + Code

CoderIndeed
0
0545. Boundary of Binary Tree

Description

The boundary of a binary tree is the concatenation of the root, the left boundary, the leaves ordered from left-to-right, and the reverse order of the right boundary.

The left boundary is the set of nodes defined by the following:

  • The root node's left child is in the left boundary. If the root does not have a left child, then the left boundary is empty.
  • If a node is in the left boundary and has a left child, then the left child is in the left boundary.
  • If a node is in the left boundary, has no left child, but has a right child, then the right child is in the left boundary.
  • The leftmost leaf is not in the left boundary.

The right boundary is similar to the left boundary, except it is the right side of the root's right subtree. Again, the leaf is not part of the right boundary, and the right boundary is empty if the root does not have a right child.

The leaves are nodes that do not have any children. For this problem, the root is not a leaf.

Given the root of a binary tree, return the values of its boundary.

 

Example 1:

Input: root = [1,null,2,3,4]
Output: [1,3,4,2]
Explanation:
- The left boundary is empty because the root does not have a left child.
- The right boundary follows the path starting from the root's right child 2 -> 4.
  4 is a leaf, so the right boundary is [2].
- The leaves from left to right are [3,4].
Concatenating everything results in [1] + [] + [3,4] + [2] = [1,3,4,2].

Example 2:

Input: root = [1,2,3,4,5,6,null,null,null,7,8,9,10]
Output: [1,2,4,7,8,9,10,6,3]
Explanation:
- The left boundary follows the path starting from the root's left child 2 -> 4.
  4 is a leaf, so the left boundary is [2].
- The right boundary follows the path starting from the root's right child 3 -> 6 -> 10.
  10 is a leaf, so the right boundary is [3,6], and in reverse order is [6,3].
- The leaves from left to right are [4,7,8,9,10].
Concatenating everything results in [1] + [2] + [4,7,8,9,10] + [6,3] = [1,2,4,7,8,9,10,6,3].

 

Constraints:

  • The number of nodes in the tree is in the range [1, 104].
  • -1000 <= Node.val <= 1000

Solutions

Solution 1: DFS

First, if the tree has only one node, we directly return a list with the value of that node.

Otherwise, we can use depth-first search (DFS) to find the left boundary, leaf nodes, and right boundary of the binary tree.

Specifically, we can use a recursive function dfs to find these three parts. In the dfs function, we need to pass in a list nums, a node root, and an integer i, where nums is used to store the current part's node values, and root and i represent the current node and the type of the current part (left boundary, leaf nodes, or right boundary), respectively.

The function implementation is as follows:

  • If root is null, then directly return.
  • If i = 0, we need to find the left boundary. If root is not a leaf node, we add the value of root to nums. If root has a left child, we recursively call the dfs function, passing in nums, the left child of root, and i. Otherwise, we recursively call the dfs function, passing in nums, the right child of root, and i.
  • If i = 1, we need to find the leaf nodes. If root is a leaf node, we add the value of root to nums. Otherwise, we recursively call the dfs function, passing in nums, the left child of root and i, as well as nums, the right child of root and i.
  • If i = 2, we need to find the right boundary. If root is not a leaf node, we add the value of root to nums. If root has a right child, we recursively call the dfs function, passing in nums, the right child of root, and i. Otherwise, we recursively call the dfs function, passing in nums, the left child of root, and i.

We call the dfs function separately to find the left boundary, leaf nodes, and right boundary, and then concatenate these three parts to get the answer.

The time complexity is O(n) and the space complexity is O(n), where n is the number of nodes in the binary tree.

PythonJavaC++GoTypeScriptJavaScript
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def boundaryOfBinaryTree(self, root: Optional[TreeNode]) -> List[int]: def dfs(nums: List[int], root: Optional[TreeNode], i: int): if root is None: return if i == 0: if root.left != root.right: nums.append(root.val) if root.left: dfs(nums, root.left, i) else: dfs(nums, root.right, i) elif i == 1: if root.left == root.right: nums.append(root.val) else: dfs(nums, root.left, i) dfs(nums, root.right, i) else: if root.left != root.right: nums.append(root.val) if root.right: dfs(nums, root.right, i) else: dfs(nums, root.left, i) ans = [root.val] if root.left == root.right: return ans left, leaves, right = [], [], [] dfs(left, root.left, 0) dfs(leaves, root, 1) dfs(right, root.right, 2) ans += left + leaves + right[::-1] return ans(code-box)

Post a Comment

0Comments

Post a Comment (0)

#buttons=(Accept !) #days=(20)

Our website uses cookies to enhance your experience. Check Now
Accept !