1. 程式人生 > >劍指offer系列(十) 二叉樹中和為某一值的路徑,複雜連結串列的複製,

劍指offer系列(十) 二叉樹中和為某一值的路徑,複雜連結串列的複製,

二叉樹中和為某一值的路徑

題目描述

輸入一顆二叉樹的跟節點和一個整數,打印出二叉樹中結點值的和為輸入整數的所有路徑。路徑定義為從樹的根結點開始往下一直到葉結點所經過的結點形成一條路徑。(注意: 在返回值的list中,陣列長度大的陣列靠前)

解題思路:

深度優先遞迴遍歷樹, 把結點加入路徑。使用列表結構存樹結構
若該結點是葉子結點則比較當前路徑和是否等於期待和,葉子節點說明該路徑應該截止了
彈出結點,每一輪遞迴返回到父結點時,當前路徑也應該回退一個結點。

程式碼:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    # 返回二維列表,內部每個列表表示找到的路徑
    def FindPath(self, root, expectNumber):
        # write code here
        if not root:
            return []
        res = []
        self.target = expectNumber
        self.dfs(root, res, [root.val])
        return res
        
    def dfs(self, root, res, path):
        if not root.left and not root.right and sum(path)==self.target:
            res.append(path)
        if root.left:
            self.dfs(root.left, res, path+[root.left.val])
        if root.right:
            self.dfs(root.right, res, path+[root.right.val])
      

複雜連結串列的複製

題目描述

輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點),返回結果為複製後複雜連結串列的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

解題思路:

 1. 根據舊連結串列建立新連結串列,不去管隨機的那個指標

 2. 根據舊連結串列中的隨機指標,建立新連結串列中的隨機指標

 3. 從舊連結串列中拆分得到新連結串列

程式碼:

# -*- coding:utf-8 -*-
# class RandomListNode:
#     def __init__(self, x):
#         self.label = x
#         self.next = None
#         self.random = None
class Solution:
    # 返回 RandomListNode
    def Clone(self, pHead):
        # write code here
        if pHead == None:
            return None
        self.CloneNodes(pHead)
        self.ConnectRandomNodes(pHead)
        return self.ReconnectNodes(pHead)
    def CloneNodes(self, pHead):
        pNode = pHead
        while pNode:
            pCloned = RandomListNode(0)
            pCloned.label = pNode.label
            pCloned.next = pNode.next
            #pCloned.random = None 
            #建立新的結點時候,random自動指向none。故註釋掉
            pNode.next = pCloned
            pNode = pCloned.next
            #將複製後的連結串列中的複製結點的random指標連結到被複制結點random指標的後一個結點
    def ConnectRandomNodes(self, pHead):
        pNode = pHead
        while pNode:
            pCloned = pNode.next
            if pNode.random !=None:
                pCloned.random = pNode.random.next
            pNode = pCloned.next
    def ReconnectNodes(self, pHead):
        pNode = pHead
        pClonedHead = pClonedNode = pNode.next
        pNode.next = pClonedHead.next
        pNode = pNode.next
        
        while pNode:
            pClonedNode.next = pNode.next
            pClonedNode = pClonedNode.next
            pNode.next = pClonedNode.next
            pNode = pNode.next
            
        return pClonedHead