zoukankan      html  css  js  c++  java
  • 剑指offer python版 二叉搜索树与双向链表

    from collections import deque
    
    
    class TreeNode(object):
        def __init__(self, x):
            self.val = x
            self.left = None
            self.right = None
    
    
    class Tree(object):
        """
        非二叉搜索树,建树的时候values中的顺序需要注意
        之后有时间会改成二叉搜索树
        """
        def __init__(self):
            self.root = None
    
        def construct_tree(self, values=None):
            # 结点值不存在的话,values中用None表示
            if not values:
                return None
            self.root = TreeNode(values[0])
            queue = deque([self.root])
            leng = len(values)
            nums = 1
            while nums < leng:
                node = queue.popleft()
                if node:
                    node.left = TreeNode(values[nums]) if values[nums] else None
                    queue.append(node.left)
                    if nums + 1 < leng:
                        node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
                        queue.append(node.right)
                        nums += 1
                    nums += 1
    
        def bfs(self):
            ret = []
            queue = deque([self.root])
            while queue:
                node = queue.popleft()
                if node:
                    ret.append(node.val)
                    queue.append(node.left)
                    queue.append(node.right)
            return ret
    
    
    class Solution(object):
    
        @staticmethod
        def convert(tree):
            """结点转换"""
            if not tree:
                return None
            p_last = Solution.convert_nodes(tree, None)
            while p_last and p_last.left:  # 获取链表头结点
                p_last = p_last.left
            return p_last
    
        @staticmethod
        def convert_nodes(tree, last):
            if not tree:
                return None
            if tree.left:
                last = Solution.convert_nodes(tree.left, last)
            if last:
                last.right = tree
            tree.left = last
            last = tree
            if tree.right:
                last = Solution.convert_nodes(tree.right, last)
            return last
    
        @staticmethod
        def print_nodes(tree):
            # 正序链表打印
            ret = []
            while tree:
                tmp = []
                tmp.append(tree.left.val if tree.left else None)
                tmp.append(tree.val)
                tmp.append(tree.right.val if tree.right else None)
                ret.append(tmp)
                tree = tree.right
            print ret
    
    if __name__ == '__main__':
        r = Tree()
        # r.construct_tree([2, 1])
        # r.construct_tree([2, None, 3])
        # r.construct_tree([2, 1, 3])
        # r.construct_tree([])
        r.construct_tree([5, 3, 6, 2, 4, None, 7, 1])
        t = Solution.convert(r.root)
    Solution.print_nodes(t)
  • 相关阅读:
    MFC 的资源文件 就是那个后缀名是 .rc的那个
    servlet 上下文
    servlet 会话技术
    页面分层
    分页技术 -servlet
    关于servlet连接数据库会出现空指针异常情况
    servlet 1
    (转)用户级和内核级线程
    (转)数据库分片Shard操作
    (转)系统设计题要考虑的方面
  • 原文地址:https://www.cnblogs.com/xzm123/p/9876434.html
Copyright © 2011-2022 走看看