1. 程式人生 > >劍指 offer_第四題_重建二叉樹

劍指 offer_第四題_重建二叉樹

平臺

牛客網

語言

python2.7.3

作業內容

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。 假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 例如輸入前序遍歷序列 {1,2,4,7,3,5,6,8} 和中序遍歷序列 {4,7,2,1,5,3,8,6},則重建二叉樹並返回。

題目理解

二叉樹及其三種遍歷

二叉樹的意義是什麼? 二叉樹的好處

什麼是二叉樹

在電腦科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作 “左子樹” 和 “右子樹”, 左子樹和右子樹同時也是二叉樹。二叉樹的子樹有左右之分,並且次序不能任意顛倒。

什麼是遞迴

遞迴是一種解決問題的方法,將問題分解為更小的子問題,直到得到一個足夠小的問題可以被很簡單的解決。 通常遞迴涉及函式呼叫自身。遞迴允許我們編寫優雅的解決方案,解決可能很難程式設計的問題。

滿二叉樹 高度為 h,由 2^h-1 個節點構成的二叉樹稱為滿二叉樹。

image

完全二叉樹 具有 n 個節點的完全二叉樹的深度為 [log2n]+1, 其中 [log2n]+1 是向下取整。滿二叉樹的深度為 k=log2(n+1)

image

二叉樹的遍歷形式

  • 先序遍歷:按照根節點 -> 左子樹 -> 右子樹

image

先序遍歷:(1) 訪問根節點;(2) 採用先序遞迴遍歷左子樹;(3) 採用先序遞迴遍歷右子樹

思維過程

(1) 先訪問根節點 A

(2)A 分為左右兩個子樹,因為是遞迴呼叫,所以左子樹也遵循 “先根節點 - 再左 - 再右” 的順序,所以訪問 B 節點,

(3) 然後訪問 D 節點,

(4) 訪問 F 節點的時候有分支,同樣遵循 “先根節點 - 再左 -- 再右” 的順序,

(5) 訪問 E 節點,此時左邊的大的子樹已經訪問完畢,

(6) 然後遵循最後訪問右子樹的順序,訪問右邊大的子樹,右邊大子樹同樣先訪問根節點 C,

(7) 訪問左子樹 G,

(8) 因為 G 的左子樹沒有,所以接下倆訪問 G 的右子樹 H,

  • 中序遍歷:按照左子樹 -> 根節點 -> 右子樹的順序訪問

image

中序遍歷:(1) 採用中序遍歷左子樹;(2) 訪問根節點;(3) 採用中序遍歷右子樹

  • 後序遍歷

image

後序遍歷:(1) 採用後序遞迴遍歷左子樹;(2) 採用後序遞迴遍歷右子樹;(3) 訪問根節點;

解題思路

分析二叉樹的前序遍歷和中序遍歷的結果

  • 前序遍歷 {1,2,4,7,3,5,6,8}
  • 中序遍歷 {4,7,2,1,5,3,8,6} image

首先構建二叉樹: 判斷輸入序列的長度

  • 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