# 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:
# time O(N) space O(N)
def boundaryOfBinaryTree(self, root: TreeNode) -> List[int]:
# order root=> left boundry ==> leaf nodes (not include leaf nodes) ==> right boundry(not include leaf nodes) in reverse order
res = []
# step1 define check leaf node func
def isLeaf(node):
if not node.left and not node.right:
return True
return False
# step2 define add leaves recursive function
def addLeaves(res,node):
if isLeaf(node):
res.append(node.val)
else:
if node.left:
addLeaves(res,node.left)
if node.right:
addLeaves(res,node.right)
if not root:
return res
# step2: add root
if not isLeaf(root):
res.append(root.val)
# step3: get left boundry
t = root.left
while t:
# add non-leaf node's value into <<res>>
if not isLeaf(t):
res.append(t.val)
print(res,'add left boudry no leaf nodes ')
if t.left:
t = t.left
else:
t = t.right
#step4 add leaves
addLeaves(res,root)
print(res,'add leaves')
#step5: get right boundry
st = []
t = root.right
while t:
# push non- leaf node'value into <<stack>>
if not isLeaf(t):
st.append(t.val)
if t.right:
t = t.right
else:
t = t.left
while st:
res.append(st.pop())
print(res,'right boudry no leaf nodes reverse order')
return res