輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如,給出:
前序遍歷 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...