• Python编程之数据结构与算法练习_009


    练习内容:

    判断一棵树是否是搜索二叉树。

    正文内容提要:

    1.创建类实现双向链表及基本栈结构。
    2.创建类表示二叉树。
    3.判断一棵树是否是搜索二叉树的递归与非递归实现。
    4.简单测试,验证正确性。

    1.创建类实现双向链表及基本栈结构。

    代码如下:

    class DoubleLinkedList:
        class Node:
            def __init__(self, data):
                self._data = data
                self._next = None
                self._pre = None
    
        def __init__(self):
            self.__head = DoubleLinkedList.Node("__head")
            self.__tail = DoubleLinkedList.Node("__tail")
            self.__head._next = self.__tail
            self.__tail._pre = self.__head
    
        def append(self, data):
            node = DoubleLinkedList.Node(data)
            self.__tail._pre._next = node
            node._pre = self.__tail._pre
            self.__tail._pre = node
            node._next = self.__tail
    
        def remove(self, data):
            node = self.__head
            while node != self.__tail:
                if node._data == data:
                    node._pre._next = node._next
                    node._next._pre = node._pre
                    break
                node = node._next
    
        def pop(self):
            node = self.__tail._pre
            if node != self.__head:
                node._pre._next = node._next
                node._next._pre = node._pre
                node._next = None
                node._pre = None
                return node._data
            return None
    
        def is_empty(self) -> bool:
            return self.__head._next == self.__tail
    
        def iternodes(self) -> None:
            node = self.__head._next
            while node != self.__tail:
                yield node._data
                node = node._next
    
        def add_last(self, data: object) -> None:
            self.append(data)
    
        def poll_first(self):
            node = self.__head._next
            if node != self.__tail:
                self.__head._next = node._next
                node._next._pre = self.__head
                node._next = None
                node._pre = None
                return node._data
            return None
    
        def poll_last(self):
            return self.pop()
    
        def peek_first(self):
            node = self.__head._next
            if node != self.__tail:
                return node._data
            return None
    
        def peek_last(self):
            node = self.__tail._pre
            if node != self.__head:
                return node._data
            return None
    
    
    class Stack:
        def __init__(self):
            self.__dlnklst = DoubleLinkedList()
    
        def pop(self):
            return self.__dlnklst.pop()
    
        def add(self, data):
            self.__dlnklst.append(data)
    
        def push(self, data):
            return self.__dlnklst.append(data)
    
        def peek(self):
            return self.__dlnklst.peek_last()
    
        def poll(self):
            return self.__dlnklst.poll_last()
    
        def is_empty(self):
            return self.__dlnklst.is_empty()

    2.创建类表示二叉树。

    代码如下:

    class Node:
        def __init__(self, data):
            self.__data = data
            self.__left = None
            self.__right = None
    
        @property
        def data(self):
            return self.__data
    
        @property
        def left(self):
            return self.__left
    
        @left.setter
        def left(self, node):
            self.__left = node
    
        @property
        def right(self):
            return self.__right
    
        @right.setter
        def right(self, node):
            self.__right = node

    3.判断一棵树是否是搜索二叉树的递归与非递归实现。

    代码如下:

    def is_bst_recur(head, pre=None):
    
        if not head:
            return True
    
        cur = head
    
        if not is_bst_recur(cur.left, pre):
            return False
    
        if pre and pre.data > cur.data:
            return False
    
        pre = cur
    
        return is_bst_recur(cur.right, pre)
    
    
    def is_bst_unrecur(head):
    
        if not head:
            return
    
        stack = Stack()
        pre = None
    
        while not stack.is_empty() or head:
            if head:
                stack.add(head)
                head = head.left
            else:
                head = stack.pop()
    
                if pre and pre.data > head.data:
                    return False
                pre = head
                head = head.right
        else:
            return True

    4.简单测试,验证正确性。

    代码如下:

    if __name__ == "__main__":
        # BST
        head1 = Node(9)
        head1.left = Node(8)
        head1.right = Node(10)
        head1.left.left = Node(7)
        head1.left.right = Node(9)
        head1.right.left = Node(9)
        head1.right.right = Node(11)
    
        print(is_bst_recur(head1))  # True
        print(is_bst_unrecur(head1)) # True
    
        # Not BST
        head2 = Node(9)
        head2.left = Node(8)
        head2.right = Node(1)
        head2.left.left = Node(7)
        head2.left.right = Node(9)
        head2.right.left = Node(9)
        head2.right.right = Node(11)
    
        print(is_bst_recur(head2))  # False
        print(is_bst_unrecur(head2)) # False
  • 相关阅读:
    a和b互换的2种方式
    spring cloud 方法调用 feign
    spring boot redis 五种类型使用实例
    springboot引入properties文件 yml文件
    Spark-Streaming结合Redis
    Spark-Streaming结合Mysql案例
    Springboot与scala编写第一个web程序
    Springboot工程Mybatis二级缓存配置
    小奇画画
    saf
  • 原文地址:https://www.cnblogs.com/orcsir/p/9017484.html
Copyright © 2020-2023  润新知