python二叉树遍历、查找和删除

参考:www.bilibili.com/video/BV1E4…

实现

不是排序二叉树,只是简单的增删查改

class Node:

    def __init__(self, id, data, left=None, right=None):
        self.id = id
        self.data = data
        self.leftNode = left
        self.rightNode = right

    # 前序
    def preOrder(self):
        """
        先打印父节点,然后左节点,然后右节点
        :return:Node
        """
        print(self.id, self.data)
        if self.leftNode is not None:
            self.leftNode.preOrder()
        if self.rightNode is not None:
            self.rightNode.preOrder()

    # 中序
    def infixOrder(self):
        """
        先打印左节点,在打印父节点,然后右节点
        :return: Node
        """
        if self.leftNode is not None:
            self.leftNode.infixOrder()
        print(self.id, self.data)
        if self.rightNode is not None:
            self.rightNode.infixOrder()

    # 后序
    def postOrder(self):
        """
        先打印左节点,然后右节点,最后是父节点
        :return:
        """
        if self.leftNode is not None:
            self.leftNode.postOrder()
        if self.rightNode is not None:
            self.rightNode.postOrder()
        print(self.id, self.data)

    # 前序查找
    def preOrderSearch(self, id):
        if self.id == id:
            return self
        # 向左递归
        resultNode = None
        if self.leftNode is not None:
            resultNode = self.leftNode.preOrderSearch(id)

        if resultNode is not None:
            return resultNode
        if self.rightNode is not None:
            resultNode = self.rightNode.preOrderSearch(id)
        return resultNode

    def infixOrderSearch(self, id):

        # 向左递归
        resultNode = None
        if self.leftNode is not None:
            resultNode = self.leftNode.preOrderSearch(id)

        if self.id == id:
            return self

        if resultNode is not None:
            return resultNode
        if self.rightNode is not None:
            resultNode = self.rightNode.preOrderSearch(id)
        return resultNode

    def postOrderSearch(self, id):
        # 向左递归
        resultNode = None
        if self.leftNode is not None:
            resultNode = self.leftNode.preOrderSearch(id)
        if resultNode is not None:
            return resultNode
        if self.rightNode is not None:
            resultNode = self.rightNode.preOrderSearch(id)
        if self.id == id:
            return self
        return resultNode

    def delNode(self, id):
        if self.leftNode is not None and self.leftNode.id == id:
            self.leftNode = None
            return True
        if self.rightNode is not None and self.rightNode.id == id:
            self.rightNode = None
            return True
        if self.leftNode is not None:
            # 返回是True说明找到了,False就往下运行代码执行向右递归
            if self.leftNode.delNode(id):
                return True
        if self.rightNode is not None:
            if self.rightNode.delNode(id):
                return True
        return False


class BinaryTree:
    def __init__(self, node):
        self.root = node

    def preOrder(self):
        self.root.preOrder()

    def infixOrder(self):
        self.root.infixOrder()

    def postOrder(self):
        self.root.postOrder()
    
    def preOrderSearch(self, id):
        if self.root is not None:
            return self.root.preOrderSearch(id)
        else:
            print("空树无法查找")

    def infixOrderSearch(self, id):
        if self.root is not None:
            return self.root.infixOrderSearch(id)
        else:
            print("空树无法查找")

    def postOrderSearch(self, id):
        if self.root is not None:
            return self.root.postOrderSearch(id)
        else:
            print("空树无法查找")

    def delNode(self, id):
        if self.root is None:
            print("空树不能删除")
        else:
            return self.root.delNode(id)


node1 = Node(1, "node1")
node2 = Node(2, "node2")
node3 = Node(3, "node3")
node4 = Node(4, "node4")
node5 = Node(5, "node5")
node6 = Node(6, "node6")
node7 = Node(7, "node7")

node1.leftNode = node2
node2.leftNode = node6
node2.rightNode = node7
node1.rightNode = node3
node3.leftNode = node4
node3.rightNode = node5

tree = BinaryTree(node1)
tree.preOrder()
print("============")
tree.infixOrder()
print("============")
tree.postOrder()
resultNode = tree.preOrderSearch(5)
print(resultNode.id)
resultNode = tree.infixOrderSearch(5)
print(resultNode.id)
resultNode = tree.postOrderSearch(5)
print(resultNode.id)
print("============")

flag = tree.delNode(15)
print(flag)
tree.preOrder()
print("============")
tree.infixOrder()
print("============")
tree.postOrder()