1. 程式人生 > >劍指offer python版 二叉搜索樹與雙向鏈表

劍指offer python版 二叉搜索樹與雙向鏈表

pytho bsp convert spa 雙向 時間 oot name num

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)

劍指offer python版 二叉搜索樹與雙向鏈表