C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

Pythonプログラミングにおける二分木ポストオーダートラバーサル


二分木があるとします。反復アプローチを使用して、このツリーのポストオーダートラバーサルを見つける必要があります。したがって、ツリーが次のような場合-

Pythonプログラミングにおける二分木ポストオーダートラバーサル

その場合、出力は次のようになります:[9,15,7,10、-10]

これを解決するには、次の手順に従います-

  • ルートがnullの場合、空の配列を返します

  • 配列を作成するret

  • stack:=ペア[root、0]

    でスタックを定義します
  • スタックが空でない間-

    • node:=スタックの一番上にあり、スタックから要素を削除します。

    • ノードペアの2番目の値が0の場合、

      • current:=ノードペアの最初の値

      • ペア(現在、1)をスタックに挿入します

      • 電流の権利が存在する場合

        • ペア[現在の権利、0]をスタックに挿入します

      • 電流の左側が存在する場合-

        • ペア[現在の左側、0]をスタックに挿入します

    • それ以外の場合、最初の値のノードペアのデータが0でない場合は、ノードの最初の値のデータをresに挿入します

  • 解像度を返す

理解を深めるために、次の実装を見てみましょう-

class TreeNode:
def __init__(self, data, left = None, right = None):
   self.data = data
   self.left = left
   self.right = right
def insert(temp,data):
   que = []
   que.append(temp)
   while (len(que)):
      temp = que[0]
      que.pop(0)
      if (not temp.left):
         if data is not None:
            temp.left = TreeNode(data)
         else:
            temp.left = TreeNode(0)
         break
      else:
         que.append(temp.left)
      if (not temp.right):
         if data is not None:
            temp.right = TreeNode(data)
         else:
            temp.right = TreeNode(0)
         break
      else:
         que.append(temp.right)
def make_tree(elements):
   Tree = TreeNode(elements[0])
   for element in elements[1:]:
      insert(Tree, element)
   return Tree
class Solution(object):
   def postorderTraversal(self, root):
      if not root:
         return []
      res = []
      stack = [[root,0]]
      while stack:
         node = stack[-1]
         stack.pop()
         if node[1]== 0 :
            current = node[0]
            stack.append([current,1])
            if current.right:
               stack.append([current.right,0])
            if current.left:
               stack.append([current.left,0])
         else:
            if node[0].data != 0:
               res.append(node[0].data)
      return res
ob = Solution()
root = make_tree([-10,9,10,None,None,15,7])
print(ob.postorderTraversal(root))

入力

[-10,9,10,None,None,15,7]

出力

[9, 15, 7, 10, -10]

  1. Pythonでの二分木の直径

    二分木があるとしましょう。木の直径の長さを計算する必要があります。二分木の直径は、実際には、ツリー内の任意の2つのノード間の最長パスの長さです。このパスは必ずしもルートを通過する必要はありません。したがって、ツリーが以下のようになっている場合、パスの長さ[4,2,1,3]または[5,2,1,3]は3であるため、直径は3になります。 これを解決するには、次の手順に従います- dfsを使用して直径を見つけ、答えを設定します:=0 ルートdfs(root)を使用してdfs関数を呼び出します dfsは以下のdfs(node)のように機能します ノードが存在しない場合は、0を返します 左

  2. Pythonで二分木を反転する

    二分木があるとします。私たちの仕事は、逆二分木を作成することです。したがって、ツリーが以下のようになっている場合- 反転したツリーは次のようになります これを解決するために、再帰的アプローチを使用します ルートがnullの場合は、戻ります 左右のポインタを入れ替える 左のサブツリーと右のサブツリーを再帰的に解決します 例(Python) 理解を深めるために、次の実装を見てみましょう- class TreeNode:    def __init__(self, data, left = None, right = None):