從中序與後序遍歷序列構造二叉樹 帶思路分析

2021-10-06 20:22:38 字數 1562 閱讀 3682

本題來自leetcode。樹節點的定義如下:

/**

* definition for a binary tree node.

* public class treenode

* }*/

首先我們得知道,前序:左根右,後序:左右根

後序的最後乙個是根節點

思考過程:

後序:首先我們選出最後乙個,也就是根節點

中序:根據後序選到的根節點,分出左右子樹序列

後序:在後序中分別找到包含根據中序分出的序列,在後序中找到最後乙個,也就是左右子樹的根節點

中序:根據上次的在後序找到的左右根節點,再次分離左右子樹序列

不斷如此迴圈,直到序列的每個數都遍歷完

在這,發現有遞迴的結構,我們用遞迴實現,資料結構使用題目提供的。

首先,我們發現,每次後序的最後乙個是根節點,我們使用3個引數來提供左右子樹序列的長度(instart:中序序列開始下標,inend:中序序列的結尾下標,postend:後序序列的結尾下標),index是在中序序列中根節點的位置,遞迴結束的條件為序列長度為0(instart>inend)

在這關於左子樹的後序序列結尾下標的計算公式為:postend=postend-(inend-index)-1,理解起來就是:左子樹序列=後序序列長度-中序序列的根右的長度,沒錯是減去根和右子樹的長度,然後不斷遞迴。整個過程就是不斷分離出左右子樹序列,找出根節點,在分離左右子樹序列,找出根節點,而每次傳進引數:後序的最後乙個,左/右子樹的開始,結束下標

class

solution

public treenode helper

(int

inorder,

int[

] postorder,

int postend,

int instart,

int inend)

int croot=postorder[postend]

;//獲得根節點

treenode node=

newtreenode

(croot)

;int index=0;

//獲得根節點在中序中的位置

for(

int i=

0;i<=inend;i++)}

node.left =

helper

(inorder,postorder,postend-

(inend-index)-1

,instart,index-1)

; node.right =

helper

(inorder,postorder,postend-

1,index+

1,inend)

;return node;

}}

從中序與後序遍歷序列構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7因為後序遍歷的順序是 左,右,根 最後乙個節點總是根節點,而中序遍...

從中序與後序遍歷序列構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree nod...

從中序與後序遍歷序列構造二叉樹

根據一棵樹的中序遍歷與後序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 中序遍歷 inorder 9,3,15,20,7 後序遍歷 postorder 9,15,7,20,3 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree nod...