スタックを使った「深さ優先探索」とキューを使った「幅優先探索」について、入力と使い方に関してわからないことが2点あります。

  1. 現在のコードを実行するときは、2分探索木(以下の例)を入力としていますが、深さ優先探索と幅優先探索の入力は2分探索木でなければならないのでしょうか。

    T = ((((), 111, ()), 11, ((), 112, ())), 1, (((), 121, ()), 12, ((), 122, ())))

  2. 現在のコードで返す結果は探索順序となっていますが、実際に仕事や競技プログラミングなどで使われる時はどのように使用されるアルゴリズムなのでしょうか。
    検索してみましたが、大学等の教育機関の資料が主でした。初心者にもわかりやすい「深さ優先探索」と「幅優先探索」のアルゴリズムが使われているコードがあれば教えていただきたいです。

どちらの探索方法が適しているのか判断の仕方が現在のコードだけだと理解できていません。

結果

depth_first_search(T)
1,12,122,121,11,112,111,

breadth_first_search(T)
1,11,12,111,112,121,122,

深さ優先探索

from collections import deque

def depth_first_search(T):
    D = deque() #スタック
    if len(T) > 0:
        D.append(T) #show(D)
    while len(D) > 0:
        L, a, R = D.pop()
        print(a, end=',') #show(D)
        if len(L) > 0:
            D.append(L) #show(D)
        if len(R) > 0:
            D.append(R) #show(D)
    print()

def show(D):
    print('[', end='')
    for (L, a, R) in D:
        print(a, end='<-')
    print(']')

幅優先探索

from collections import deque

def breadth_first_search(T):
    D = deque() #キュー
    if len(T) > 0:
        D.append(T) #show(D)
    while len(D)>0:
        L, a, R = D.popleft()
        print(a, end=',') #show(D)
        if len(L)>0:
            D.append(L) #show(D)
        if len(R)>0:
            D.append(R) #show(D)
    print()



def show(D):
    print('[', end='')
    for (L, a, R) in D:
        print(a, end='<-')
    print(']')