1. 程式人生 > >劍指offer:從上到下列印二叉樹(Python)

劍指offer:從上到下列印二叉樹(Python)

題目描述

從上往下打印出二叉樹的每個節點,同層節點從左至右列印。

解題思路

條件反射地想通過遞迴解決,結果硬是沒有找到合適的解決思路,也許遞迴的方式不是很適合這種型別的題目吧~
利用佇列的先進先出(FIFO)特性解決。每從佇列頭部獲取一個節點,就將該節點的左右子節點存入佇列的尾部。如此往復,直至佇列為空。這篇部落格內的圖片和表格很形象的展示了程式執行過程中佇列內值的變化過程:

二叉樹樣例:
這裡寫圖片描述
列印二叉樹每層節點時佇列內值的變化:
這裡寫圖片描述

Python程式碼

def PrintFromTopToBottom(self, root):
    queue = []
    result = []
    if
root == None: return result queue.append(root) while queue: newNode = queue.pop(0) result.append(newNode.val) if newNode.left != None: queue.append(newNode.left) if newNode.right != None: queue.append(newNode.right) return result

帶測試的Python程式碼:

class Solution:
   #從上往下打印出二叉樹的每個節點,同層節點從左至右列印
    def PrintFromTopToBottom(self, root):
        array = []
        result = []
        if root == None:
            return result

        array.append(root)
        while array:
            newNode = array.pop(0)
            result.append(newNode.val)
            if
newNode.left != None: array.append(newNode.left) if newNode.right != None: array.append(newNode.right) return result # 給定二叉樹的前序遍歷和中序遍歷,獲得該二叉樹 def getBSTwithPreTin(self, pre, tin): if len(pre)==0 | len(tin)==0: return None root = treeNode(pre[0]) for order,item in enumerate(tin): if root .val == item: root.left = self.getBSTwithPreTin(pre[1:order+1], tin[:order]) root.right = self.getBSTwithPreTin(pre[order+1:], tin[order+1:]) return root class treeNode: def __init__(self, x): self.left = None self.right = None self.val = x if __name__ == '__main__': flag = "printTreeNode" solution = Solution() preorder_seq = [1, 2, 4, 7, 3, 5, 6, 8] middleorder_seq = [4, 7, 2, 1, 5, 3, 8, 6] treeRoot1 = solution.getBSTwithPreTin(preorder_seq, middleorder_seq) if flag == "printTreeNode": newArray = solution.PrintFromTopToBottom(treeRoot1) print(newArray)

相關連結:

順序列印二叉樹節點:初級版本(當前頁)

相關推薦

offer】之字形列印python

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 在上一篇部落格中:層次遍歷,每一層在一行輸出中,只需要將奇數行的result反轉一下就行了 另外一種方法就是,需要反轉佇列的結果,

offer上到下列印Python

題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 解題思路 條件反射地想通過遞迴解決,結果硬是沒有找到合適的解決思路,也許遞迴的方式不是很適合這種型別的題目吧~ 利用佇列的先進先出(FIFO)特性解決。每從佇列頭部獲取一個節點,就將該

offer上到下列印Python

題目描述 從上往下列印出二叉樹的每個節點,同層節點從左至右列印。 思路:用兩個list,一個用來裝節點,一個用來裝節點的value。對於裝節點的這個list,我們每次彈出最前面的節點,並依次將左節

offer輸入一棵,判斷該是否是平衡

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 //後續遍歷二叉樹,遍歷過程中求子樹高度,判斷是否平衡 class Solution { public: bool IsBalanced(TreeNode *root, int & dep){

offer第25題和為某一值得路徑

//思路:可以利用全路徑逐層遞減,在用遞迴來尋找路徑 import java.util.ArrayList; import java.util.List; public class _Test_25_2 { ArrayList<ArrayList

offer 33. 之字形列印

請實現一個函式按照之字形順序從上向下列印二叉樹。 即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。 樣例 輸入如下圖所示二叉樹[8, 12, 2, null, null, 6, 4, null, null, nul

offer面試題7:重建java實現

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹,假設輸入的前序遍歷和中序遍歷的結果都不含重複的數字。例如:輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6}則重建二叉樹:其中二叉樹的定義如下:  * publi

offer旋轉陣列的最小數字Python

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非遞減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0

offer連結串列中環的入口結點Python

題目描述 一個連結串列中包含環,請找出該連結串列的環的入口結點。 解題思路 思路1: 用慣了字典,立即想到用字典儲存每個節點。當某個節點出現的次數為2時返回該節點。 def EntryNodeOfLoop(self, pHead): dic

offer滑動視窗的最大值Python

題目描述 給定一個數組和滑動視窗的大小,找出所有滑動窗口裡數值的最大值。例如,如果輸入陣列{2,3,4,2,6,2,5,1}及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為{4,4,6,6,6,5}; 針對陣列{2,3,4,2,6,2,5,1}

offer整數中1出現的次數python

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。

offer陣列中的逆序對Python

題目描述 在陣列中的兩個數字,如果前面一個數字大於後面的數字,則這兩個數字組成一個逆序對。輸入一個數組,求出這個陣列中的逆序對的總數P。並將P對1000000007取模的結果輸出。 即輸出P%1000000007 解題思路 這道題在牛客網上,有Pytho

offer》系列 上往下列印Java

連結 牛客:從上往下列印二叉樹 題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 思路 題目給定函式返回的只是一個ArrayList,還是比較簡單的,這種型別題目基本都要藉助一個輔助的佇列,看程式碼大家應該都能理解。 程式碼 import ja

offer》系列 上往下列印Java

連結 題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 思路 題目給定函式返回的只是一個ArrayList,還是比較簡單的,這種型別題目基本都要藉助一個輔助的佇列,看程式碼大家應該都能

牛客網offer程式設計題——上往下列印Java

解題思路:從上往下列印,則是父節點—>左子節點—>右子節點的順序,總的來說順序是很明確的,左子節點的子節點也優先於右子節點的子節點,所以只要從左往右依次遍歷左右子節點,子節點的子節點也能是順序排列的,佇列可以滿足該需求 程式碼如下:import java.ut

offer》把一棵列印成多行

注:此部落格不再更新,所有最新文章將發表在個人獨立部落格limengting.site。分享技術,記錄生活,歡迎大家關注 題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 im

offer》面試題39 的深度java

設計模式 博客 rgs 歷史 存在 復制 pri 取值 今天 摘要: 今天翻到了《劍指offer》面試題39,題目二中的解法二是在函數的參數列表中通過指針的方式進行傳值,而java是沒有指針的,所以函數要進行改造。然而我翻了下別人的java版本(我就想看看有什麽高大上的改造

offer三十八之的深度

ret terminal pro roo 結點 路徑 splay close solution 一、題目   輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 二、思路   遞歸,詳見代碼。 三、代碼

offer】7、重建

nbsp treenode truct 遞歸函數 tar end || 部分 遍歷 題目 給出二叉樹的前序遍歷與中序遍歷結果,重建該二叉樹。 思路 由於前序遍歷的第一個數字是根節點,將中序遍歷分為左右子樹兩個部分。接下來就遞歸,將左子樹和右子樹的序列分離出來,然後調用遞歸函

Offer】操作給定的,將其變換為源的鏡像。

right 鏡像 tree style turn val 交換 實現 oot 二叉樹的鏡像定義:源二叉樹 8 / \ 6 10 / \ / \ 5 7 9 11 鏡像二叉樹 8