删除父节点时Python二叉树不移动子节点

删除父节点时Python二叉树不移动子节点,python,binary-tree,Python,Binary Tree,所以我有这个代码: import random randomList = [] randomListSize = 10 class Node: def __init__(self, rootValue): self.data = rootValue self.left = None self.right = None class Tree: def createNode(self, data): ret

所以我有这个代码:

import random

randomList = []
randomListSize = 10


class Node:

    def __init__(self, rootValue):
        self.data = rootValue
        self.left = None
        self.right = None


class Tree:

    def createNode(self, data):
        return Node(data)

    def insertNode(self, node, data):
        if node is None:

            # Create root node

            return self.createNode(data)

        # Root node already exists

        if data < node.data:

            # New node data is less than root node

            node.left = self.insertNode(node.left, data)
        elif data > node.data:

            # New node data is bigger than root node

            node.right = self.insertNode(node.right, data)

        # Save new node data

        return node

    def searchNode(self, node, data):
        if node is None or node.data == data:

            # Node is found

            return node
        elif node.data > data:

            # Node may be to the left of the root

            return self.searchNode(node.left, data)
        elif node.data < data:

            # Node may be to the right of the root

            return self.searchNode(node.right, data)
        else:

            # Node is not found

            return None

    def deleteNode(self, node, data):
        if self.searchNode(node, data) is None:
            print "Node doesn't exist"
            return None
        else:

            # Node exists

            if data < node.data:
                node.left = self.deleteNode(node.left, data)  # DELETED NODE IS STILL RETURNED
            elif data > node.data:
                node.right = self.deleteNode(node.right, data)
            elif data == node.data:

                # Node has no children

                if node.left is None and node.right is None:
                    del node
                    return None
                elif node.left is None:

                # Node has 1 child

                    temp = node.right
                    node = None
                    return temp
                elif node.right is None:
                    temp = node.left
                    node = None
                    return temp
                else:

                    # Node has 2 children so find inorder successor

                    temp = self.inorderSuccessor(node.right)
                    node.data = temp.data
                    if temp.right is not None:
                        temp = temp.right
                    print node.right.left.data

    def inorderSuccessor(self, node):
        while node.left is not None:
            node = node.left
        return node

    def preorder(self, node):

        # Root then left sub-tree then right sub-tree

        if node is not None:
            print node.data
            self.preorder(node.left)
            self.preorder(node.right)

    def inorder(self, node):

        # Left sub-tree then root then right sub-tree

        if node is not None:
            self.inorder(node.left)
            print node.data
            self.inorder(node.right)

    def postorder(self, node):

        # Left sub-tree then right sub-tree then root

        if node is not None:
            self.postorder(node.left)
            self.postorder(node.right)
            print node.data


def setup():
    randomList = []
    for i in range(randomListSize):
        randomList.append(random.randint(1, 100))
    print randomList
    randomList = [
        59,
        90,
        93,
        23,
        60,
        85,
        64,
        23,
        15,
        15,
        ]
    print randomList
    tree = Tree()
    root = tree.insertNode(None, randomList[0])  # Create root node
    for i in range(len(randomList) - 1):
        tree.insertNode(root, randomList[i + 1])  # Create each child node
    return (tree, root)


def traverse():
    while True:
        try:
            user = \
                int(input('1 for preorder, 2 for inorder and 3 for postorder: '
                    ))
            if user == 1:
                tree.preorder(root)
            elif user == 2:
                tree.inorder(root)
            elif user == 3:
                tree.postorder(root)
            else:
                print 'Invalid choice'
        except ValueError:
            print 'Invalid choice'
        break


if __name__ == '__main__':
    (tree, root) = setup()
    while True:
        try:
            userChoice = \
                int(input('Enter 1 to add a node, 2 to search for a node, 3 to delete a node and 4 to traverse the tree: '
                    ))
            if userChoice == 1:
                newNode = int(input('Enter a number: '))
                tree.insertNode(root, newNode)
            elif userChoice == 2:
                userSearch = int(input('Enter a number: '))
                if tree.searchNode(root, userSearch) is not None:
                    print (userSearch, 'exists')
                else:
                    print "Node doesn't exist"
            elif userChoice == 3:
                removeNode = int(input('Enter a number: '))
                tree.deleteNode(root, removeNode)
            elif userChoice == 4:
                traverse()
            else:
                print 'Invalid choice'
        except ValueError:
            print 'Invalid choice'

随机导入
随机列表=[]
randomListSize=10
类节点:
def uuu init uuu(self,rootValue):
self.data=rootValue
self.left=无
self.right=无
类树:
def createNode(自身,数据):
返回节点(数据)
def insertNode(自身、节点、数据):
如果节点为无:
#创建根节点
返回self.createNode(数据)
#根节点已存在
如果数据<节点数据:
#新节点数据少于根节点
node.left=self.insertNode(node.left,数据)
elif data>node.data:
#新节点数据大于根节点
node.right=self.insertNode(node.right,数据)
#保存新节点数据
返回节点
def searchNode(自身、节点、数据):
如果node为None或node.data==数据:
#找到节点
返回节点
elif node.data>数据:
#节点可能位于根的左侧
返回self.searchNode(node.left,数据)
elif node.data<数据:
#节点可能位于根的右侧
返回self.searchNode(node.right,数据)
其他:
#找不到节点
一无所获
def deleteNode(自身、节点、数据):
如果self.searchNode(节点,数据)为无:
打印“节点不存在”
一无所获
其他:
#节点存在
如果数据<节点数据:
node.left=self.deleteNode(node.left,数据)#删除的节点仍会返回
elif data>node.data:
node.right=self.deleteNode(node.right,数据)
elif data==节点数据:
#节点没有子节点
如果node.left为无,node.right为无:
德尔节点
一无所获
elif node.left为无:
#节点有1个子节点
temp=node.right
节点=无
返回温度
elif node.right为无:
temp=node.left
节点=无
返回温度
其他:
#节点有2个子节点,因此按顺序查找后续节点
temp=自索引接受器(右节点)
node.data=temp.data
如果temp.right不是无:
温度=右侧温度
打印node.right.left.data
def inorderSuccessor(自身,节点):
而node.left不是无:
node=node.left
返回节点
def预订单(自身、节点):
#根,然后左子树,然后右子树
如果节点不是“无”:
打印节点数据
self.preorder(节点左)
self.preorder(node.right)
def索引器(自身,节点):
#左子树然后根然后右子树
如果节点不是“无”:
self.inoder(node.left)
打印节点数据
self.inoder(node.right)
def后订单(自身、节点):
#左子树然后右子树然后根
如果节点不是“无”:
self.postorder(节点左)
self.postorder(node.right)
打印节点数据
def设置():
随机列表=[]
对于范围内的i(随机列表大小):
randomList.append(random.randint(1100))
打印随机列表
随机列表=[
59,
90,
93,
23,
60,
85,
64,
23,
15,
15,
]
打印随机列表
tree=tree()
root=tree.insertNode(无,随机列表[0])#创建根节点
对于范围内的i(len(randomList)-1):
tree.insertNode(根,随机列表[i+1])#创建每个子节点
返回(树、根)
def traverse():
尽管如此:
尝试:
用户=\
int(输入('1表示前序,2表示内序,3表示后序:'
))
如果用户==1:
树。前序(根)
elif user==2:
目录树索引(根)
elif user==3:
树。postorder(根)
其他:
打印“无效选择”
除值错误外:
打印“无效选择”
打破
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
(树,根)=设置()
尽管如此:
尝试:
用户选择=\
int(输入('输入1添加节点,输入2搜索节点,输入3删除节点,输入4遍历树:'
))
如果userChoice==1:
newNode=int(输入('输入一个数字:'))
tree.insertNode(根,新节点)
elif userChoice==2:
userSearch=int(输入('输入一个数字:'))
如果tree.searchNode(root,userSearch)不是None:
打印(用户搜索“存在”)
其他:
打印“节点不存在”
elif userChoice==3:
removeNode=int(输入('输入一个数字:'))
tree.deleteNode(根,removeNode)
elif userChoice==4:
导线测量()
其他:
打印“无效选择”
除值错误外:
打印“无效选择”
当我有两个子节点并试图查找顺序继承节点时,我的错误出现在
deleteNode()
中。我可以这样做,然后用后继节点的内容替换目标节点,但它不会向上移动后继节点的所有子节点,而是让它创建两个重复节点

任何想法,谢谢