演算法07(重建二叉樹)

2021-10-08 04:11:12 字數 1873 閱讀 1611

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。

例如,給出:

前序遍歷 preorder =

[3,9,20,15,7]

中序遍歷 inorder =

[9,3,15,20,7]

返回如下的二叉樹:

3

/ \9 20

/ \

15 7

以下是用遞迴寫出的方法,使用了時間換空間的做法,因為無法動態載入陣列。

package mypage;

public class solution

; intid

=;solution solution = new solution();

treenode tree = solution.buildtree(pd, id)

; print_tree(tree);}

public treenode buildtree(int[

] preorder, int[

] inorder)

int root = preorder[0]

;//根節點

int left_len = 0;//左子樹個數

int right_len = 0;//右子樹個數

for(int i = 0;i

} int[

] pd_left = new int[left_len]

;//左子樹前序

int[

] id_left = new int[left_len]

;//左子樹中序

int[

] pd_right = new int[right_len]

;//右子樹前序

int[

] id_right = new int[right_len]

;//右子樹中序

// system.out.println(

"*****====前序**********==");

for(int i = 1,j=0,k=0;i

else

}// system.out.println(

"*****====中序**********==");

for(int i = 0,j=0,k=0;i

else if((left_len)

==i)

else

} solution solution = new solution();

treenode rootnode = new treenode(root)

; //先遞迴左子樹

if(left_len!=0)

if(right_len!=0)

return rootnode;}

public static void print_tree(treenode treenode)

if(treenode.right != null)

}}

思路解讀:

**解讀:

判斷陣列是否為空,為空則返回null。(第一次提交,就遇到這個坑,往後需要注意)

遍歷迴圈前序和中序,記錄左子樹和右子樹的節點個數。

根據節點個數建立陣列,獲取到左子樹前序中序和右子樹前序中序。

建立當前節點,將當前節點的值傳入。(當前節點的值就是前序第乙個值)

開始遞迴,先遞迴左子樹,將左子樹返回值新增到當前節點的左子樹上。之後遞迴右子樹。

最後返回本節點。

07 重建二叉樹

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。示例 前序遍歷 preorder 3 9,20 15,7 中序遍歷 inorder 9 3,15 20,7 返回如下的二叉樹 3 920 157 definition for a ...

07 重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 限制 0 節點個數 5000 解 ...

07 重建二叉樹

利用python陣列的index函式來定位根節點在inorder陣列中的位置 index inorder.index root.val preorder陣列不需要進行切片操作,遞迴終止條件主要靠 前兩行中的not inorder來終止。root.left self.buildtree preorde...