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

Pythonを使用して誤った二分木を修正するプログラム


問題のある二分木が与えられたとしましょう。ノードの右の子ポインタの1つが、バイナリツリーの同じレベルにある別のノードを誤って指しています。したがって、この問題を修正するには、このエラーが発生しているノードを見つけて、誤って指しているノードを除くそのノードとその子孫を削除する必要があります。固定二分木のルートノードを返します。

したがって、入力が次のような場合

Pythonを使用して誤った二分木を修正するプログラム

4と6の間に誤ったリンクがあることがわかります。4の右の子ポインタは6を指しています。

次に、出力、修正されたツリーの順序の表現は、-2、3、5、6、7、8

になります。

ノード4は、ノード6への誤ったリンクがあるため、削除されます。

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

  • q:=ルートを含む新しい両端キュー

  • p:=新しいマップ

  • 訪問した:=新しいセット

  • qが空でない間、実行します

    • cur:=qの左端の要素をポップ

    • 訪問者にcurが存在する場合、

      • is_left:=p [p [cur、0]]

      • grand_p:=p [p [cur、0]]

      • is_leftがnullでない場合、

        • grand_pの左側:=null

      • それ以外の場合

        • grand_pの権利:=null

      • ルートを返す

    • 訪問したの追加(cur)

    • curの左側がnullでない場合、

      • p [curの左側]:=新しいタプル(cur、1)

      • qの最後にcurの左側を挿入します

    • curの権利がnullでない場合、

      • p [curの権利]:=新しいタプル(cur、0)

      • qの最後にcurの右を挿入します

  • ルートを返す

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

import collections
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
def search_node(root, element):
   if (root == None):
      return None
   if (root.data == element):
      return root
      res1 = search_node(root.left, element)
   if res1:
      return res1
   res2 = search_node(root.right, element)
   return res2
def print_tree(root):
   if root is not None:
      print_tree(root.left)
      print(root.data, end = ', ')
      print_tree(root.right)
def solve(root):
   q = collections.deque([root])
   p, visited = dict(), set()
   while q:
      cur = q.popleft()
      if cur in visited:
         grand_p, is_left = p[p[cur][0]]
         if is_left: grand_p.left = None
            else: grand_p.right = None
            return root
      visited.add(cur)
      if cur.left:
         p[cur.left] = (cur, 1)
         q.append(cur.left)
      if cur.right:
         p[cur.right] = (cur, 0)
         q.append(cur.right)
   return root
root = make_tree([5, 3, 7, 2, 4, 6, 8])
link_from = search_node(root, 4)
link_to = search_node(root, 6)
link_from.right = link_to
print_tree(solve(root))

入力

root = make_tree([5, 3, 7, 2, 4, 6, 8])
link_from = search_node(root, 4)
link_to = search_node(root, 6)
link_from.right = link_to

出力

2, 3, 5, 6, 7, 8,

  1. Pythonで二分木の最大幅を見つけるプログラム

    二分木があるとすると、ツリー内の任意のレベルの最大幅を見つける必要があります。ここで、レベルの幅は、左端のノードと右端のノードの間に保持できるノードの数です。 したがって、入力がのような場合 その場合、出力は2になります これを解決するために、次の手順に従います- マップdを作成し、最小値と最大値を保持するには、最小値は最初は無限大で、最大値は0です 関数dfs()を定義します。これはルートを取ります、pos:=0、depth:=0 ルートがnullの場合、戻り値はありません d [depth、0] =d [depth、0]とposの最小値 d [d

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

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