如何在二进制搜索树中将父指针与插入函数一起包含

问题描述

我有一个find_successor函数,我想调用current.parent,但我意识到它是None类型,因为在我的insert()中,我从未将parent用作指针。我想知道如何在不必过多修改代码的情况下将父指针实现到我的insert()中。

class Node(object):
  def __init__(self,data):
    self.parent = None
    self.left = None
    self.right = None
    self.data = data

class Tree(object):
 PREORDER = 1
 InorDER = 2
 postorder = 3

  def __init__(self):
    # Do not create any other private variables.
    # You may create more helper methods as needed.
    self.root = None

  def print(self):
   # Print the data of all nodes in order
   self.__print(self.root)

  def __print(self,curr_node):
    # Recursively print a subtree (in order),rooted at curr_node
    if curr_node is not None:
        self.__print(curr_node.left)
        print(str(curr_node.data),end=' ')  # save space
        self.__print(curr_node.right)

  def insert(self,data):
    # Find the right spot in the tree for the new node
    # Make sure to check if anything is in the tree
    # Hint: if a node n is null,calling n.getData() will cause an error
    if self.root is None:
        self.root = Node(data)
    else:
        current = self.root
        while True:
            if current.data > data:
                if current.left == None:
                    current.left = Node(data)
                else:
                    current = current.left
            elif current.data < data:
                if current.right == None:
                    current.right = Node(data)
                    break
                else:
                    current = current.right
            else:
                break

这是我正在使用的find_successor函数,可以在其中使用辅助方法来找到节点,但它没有父节点。

    def find_successor(self,data):
# helper method to implement the delete method but may be called on its own
# if the right subtree of the node is nonempty,then the successor is just
# the leftmost node in the right subtree.
# If the right subtree of the node is empty,then go up the tree until a node that is
# the left child of its parent is encountered. The parent of the found node will be the
# successor to the initial node.

# Return object of successor if found else return None
    current = self.__find_node(data)
    if current.right:
       while (current.right):
          current = current.right
          if current.left:
              current = current.left
          else:
              return current
       return current
   else:
      print(current.parent.data)


  def __find_node(self,data):
# returns the node with that particular data value else returns None
   current = self.root
   while current is not None:
       if (data > current.data):

         current = current.right
       elif (data < current.data):
          current = current.left
       elif (data == current.data):
          return current
   return None

这是我的测试用例

class T3_successor(unittest.TestCase)`:

   def test_successor(self):
     print("\n")
     print("successor function")
     tree_success = lab3.Tree()
     tree_success.insert(8)
     tree_success.insert(3)
     tree_success.insert(10)
     tree_success.insert(1)
     tree_success.insert(6)
     tree_success.insert(4)
     tree_success.insert(7)
     tree_success.insert(14)
     tree_success.insert(13) 

     easy_success =tree_success.find_successor(8).data
     medium_success = tree_success.find_successor(10).data
     tough_success = tree_success.find_successor(7).data

     self.assertEqual(easy_success,10)
     self.assertEqual(medium_success,13)
     self.assertEqual(tough_success,8)

print("\n")

解决方法

应该不会太复杂:在您的insert()方法中,当您将节点设置为新节点时,还将它们的父级(现在就不用了)设置为您来自的最后一个节点。 当您执行此操作时,根节点以外的每个节点都将根据需要具有指向其父节点的指针。