1. 程式人生 > >劍指offer-----重建二叉樹(java版)

劍指offer-----重建二叉樹(java版)

一 題目

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

二 例子

輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

三 思路

根據前序遍歷可以知道二叉樹的根為1,所以中序遍歷中前3個是根的左子樹,1的後面元素是根的右子樹,可以看到,前序遍歷的1(根)的後3個是根的左子樹,後4個是根的右子樹,所以程式一開始應該找到中序遍歷樹的根位置,然後遞迴構建二叉樹。以根作為標準,以中序遍歷左側n個元素與前序遍歷除根之外的前n個元素進行左子樹構建,以中序遍歷右側n個元素與前序遍歷除根之外的後n個元素進行右子樹構建。

四 程式原始碼

import java.util.Arrays;
/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length==0 || in.length==0)
	    	   return null;
	       TreeNode node = new TreeNode(pre[0]);
	       for(int i=0;i<pre.length;i++){
	    	   if(pre[0] == in[i]){
	    		   node.left = reConstructBinaryTree(Arrays.copyOfRange(pre,1,i+1),Arrays.copyOfRange(in,0,i));
	    		   node.right = reConstructBinaryTree(Arrays.copyOfRange(pre,i+1,pre.length),Arrays.copyOfRange(in,i+1,in.length));
	    		   break;
	    	   }
	       }
	       return node;
    }
}

相關推薦

offer-----重建(java)

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

Offer——重建

urn return 重復 col 分割 init 樹的遍歷 ++ fin 題目描述: 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,

offer--重建

lag node rec 劍指offer == str eno truct 個數字 題目 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4

offer ——重建

數字 分析 nal nod 遍歷 中序遍歷 i++ algorithm vector p62 輸入前序和中序遍歷的結果(不包含重復的數字),重建二叉樹。 主要是分析兩個序列的規律,然後用遞歸的方式找到每一個根節點,從而完成構建。 #include<iostream&

offer - 重建

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 每顆子樹的根節點肯定

offer[重建]

劍指offer[重建二叉樹] 題目描述 思路 程式碼 細節知識 題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列

[python]offer -- 重建

題目描述 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 程式碼實現 # -*- codi

offer------重建

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

offer 重建

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

牛客網刷題--offer(重建)

題目描述是這樣的: 給你一個樹的前序遍歷和中序遍歷,希望你能重建這個二叉樹的結構,題目還給了一個例子:某二叉樹的前序遍歷為{1, 2, 4, 7, 3, 5, 6, 8}和中序遍歷{4, 7, 2, 1, 5, 3, 8, 6},重建二叉樹並返回該二叉樹的根

offer----重建

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

offer-重建

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

day16offer---重建

題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸出的前序遍歷和中序遍歷的結果都不含有重複的數字。前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5 二叉樹節點的定義如下: struct TreeNode {

Offer】- 重建[Java]

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

Javaoffer(27) 的鏡像

.cn tree 解釋 問題 true mir 形象 收獲 ror 本文參考自《劍指offer》一書,代碼采用Java語言。 更多:《劍指Offer》Java實現合集 題目    請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像。 思路   畫圖可以很清晰地

offer中和為某一值得路徑 java

路徑為從根節點到葉節點一條路徑,路徑經過的各節點數值之和等於某一給定數值,則列印路徑上的節點 因為需要列印滿足條件的路徑節點資訊和各節點之和,需要棧記錄經過的節點,和一個儲存數值之和的變數用前序遍歷

offer:判斷是不是平衡java

題目:輸入一棵二叉樹的根節點,判斷該樹是不是平衡的二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。     有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,呼叫函式TreeDepth得到

Offer-根據的前序和後序遍歷重建

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

offer鏡像

tno eno 描述 temp 結點 輸出 urn tree 定義 package Problem19; /* * 問題描述: * 請完成一個函數,輸入一個二叉樹,該函數輸出它的鏡像; */ //定義二叉樹的結構 class BinaryTreeNode {

Offer——把打印成多行

blog queue 隊列 int 利用 vector ont str logs 題目描述: 從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 分析: 二叉樹的層次遍歷,利用隊列。 代碼: 1 /* 2 struct TreeNode { 3