劍指 offer_第四題_重建二叉樹
平臺
牛客網
語言
python2.7.3
作業內容
題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。 假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 例如輸入前序遍歷序列 {1,2,4,7,3,5,6,8} 和中序遍歷序列 {4,7,2,1,5,3,8,6},則重建二叉樹並返回。
題目理解
二叉樹的意義是什麼? 二叉樹的好處
什麼是二叉樹
在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 “左子樹” 和 “右子樹”, 左子樹和右子樹同時也是二叉樹。二叉樹的子樹有左右之分,並且次序不能任意顛倒。
遞迴是一種解決問題的方法,將問題分解為更小的子問題,直到得到一個足夠小的問題可以被很簡單的解決。 通常遞迴涉及函式呼叫自身。遞迴允許我們編寫優雅的解決方案,解決可能很難程式設計的問題。
滿二叉樹 高度為 h,由 2^h-1 個節點構成的二叉樹稱為滿二叉樹。
完全二叉樹 具有 n 個節點的完全二叉樹的深度為 [log2n]+1, 其中 [log2n]+1 是向下取整。滿二叉樹的深度為 k=log2(n+1)
二叉樹的遍歷形式
- 先序遍歷:按照根節點 -> 左子樹 -> 右子樹
先序遍歷:(1) 訪問根節點;(2) 採用先序遞迴遍歷左子樹;(3) 採用先序遞迴遍歷右子樹
思維過程:
(1) 先訪問根節點 A
(2)A 分為左右兩個子樹,因為是遞迴呼叫,所以左子樹也遵循 “先根節點 - 再左 - 再右” 的順序,所以訪問 B 節點,
(3) 然後訪問 D 節點,
(4) 訪問 F 節點的時候有分支,同樣遵循 “先根節點 - 再左 -- 再右” 的順序,
(5) 訪問 E 節點,此時左邊的大的子樹已經訪問完畢,
(6) 然後遵循最後訪問右子樹的順序,訪問右邊大的子樹,右邊大子樹同樣先訪問根節點 C,
(7) 訪問左子樹 G,
(8) 因為 G 的左子樹沒有,所以接下倆訪問 G 的右子樹 H,
- 中序遍歷:按照左子樹 -> 根節點 -> 右子樹的順序訪問
中序遍歷:(1) 採用中序遍歷左子樹;(2) 訪問根節點;(3) 採用中序遍歷右子樹
- 後序遍歷
後序遍歷:(1) 採用後序遞迴遍歷左子樹;(2) 採用後序遞迴遍歷右子樹;(3) 訪問根節點;
解題思路
分析二叉樹的前序遍歷和中序遍歷的結果
首先構建二叉樹: 判斷輸入序列的長度
- len=0 返回空
- len=1 只存在一個根節點
- len>1
未完待續。。。。
程式
-*- coding:utf-8 -*-
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 返回構造的TreeNode根節點
def reConstructBinaryTree(self, pre, tin):
# write code here
To be honest
I don't understand