Given the root of a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom.
Bir binary tree (ikili ağaç) verildiğinde, sağdan bakıldığında görülen düğümlerin listesini döndürmemiz isteniyor.
Bu soruyu BFS (Genişlik Öncelikli Arama) veya DFS (Derinlik Öncelikli Arama) ile çözebiliriz.
BFS (Level Order - Kuyuğa Dayalı Çözüm)
Ağaç seviyelerini level order (katman bazlı) BFS ile gezeriz.
Her seviyede en sağdaki düğümü alırız.
DFS (Sağdan Öncelikli Derinlemesine Arama)
Önce sağ çocuğa giderek DFS yaparsak, her seviyede ilk ziyaret edilen düğüm sağ taraftan görülen düğüm olur.
Her seviyede sadece ilk düğümü ekleriz.
Eğer ağacın çok derin olduğunu biliyorsan, BFS kullan çünkü DFS stack overflow hatasına sebep olabilir. Ama genellikle DFS daha az bellek tüketir.
Code
fromcollectionsimportdequeclassSolution:defrightSideView(self,root):ifnotroot:return[]result=[]queue=deque([root])whilequeue:level_size=len(queue)foriinrange(level_size):node=queue.popleft()# Eğer bu seviyenin en sağındaki düğümseifi==level_size-1:result.append(node.val)# Önce sol, sonra sağ çocukları ekleifnode.left:queue.append(node.left)ifnode.right:queue.append(node.right)returnresult
Complexity
Time complexity (Zaman Karmaşıklığı): O(N) çünkü her düğüm bir kez ziyaret edilir.
Space complexity (Alan Karmaşıklığı): O(N) en kötü durumda kuyrukta tüm seviyedeki düğümler tutulur.
Code
classSolution:defrightSideView(self,root):result=[]defdfs(node,depth):ifnotnode:return# Eğer bu seviyede ilk kez bir düğüm ziyaret ediliyorsa, ekleifdepth==len(result):result.append(node.val)# Önce sağ çocuğa git, sonra sol çocuğadfs(node.right,depth+1)dfs(node.left,depth+1)dfs(root,0)returnresult
Complexity
Time complexity (Zaman Karmaşıklığı): O(N) çünkü her düğüm bir kez ziyaret edilir.
Space complexity (Alan Karmaşıklığı): O(H) (H = ağacın yüksekliği, dengeli ağaçta O(logN), düz ağaçta O(N)).