根據二叉樹的前序遍歷和中序遍歷輸出二叉樹

2021-10-25 02:49:31 字數 1465 閱讀 9058

根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列 和中序遍歷序列,則重建二叉樹並返回。

這是一道《劍指offer》上的題目,主要考察了二叉樹的遍歷方法;

剛開始做這道題,首先得掌握二叉樹的三種遍歷方式:

前序遍歷:先訪問根結點,然後前序遍歷左子樹,再前序遍歷右子樹。

中序遍歷:中序遍歷根結點的左子樹,然後訪問根結點,最後中序遍歷右子樹。

後序遍歷:後序遍歷根結點的左子樹,再後序遍歷根結點的右子樹,最後訪問根結點。

有了基礎概念之後,就可以分析這道題了。既然要用遞迴,那就得先明白三點: 1,需要幹什麼(輸出乙個二叉樹);2,什麼步驟(每次都需要先根據前序遍歷的根節點來擷取中序遍歷,將其作為根節點的左節點和右節點);3,什麼時候結束(當最後的陣列長度為1,而樹的結束也可能到只有左節點和只有右節點)

那麼根據這三點就能大致寫出遞迴方法了;

需要注意的是,這裡擷取陣列的時候需要知道陣列的下標,所以先寫了個方法獲取陣列下標:

private static int getindex(int arr, int val) 

}return -1;

}

然後就是構建樹的遞迴方法:

/**

* 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。

* 每次都需要先根據前序遍歷的根節點來擷取中序遍歷,將其作為根節點的左節點和右節點

* @param dlrarr 前序

* @param ldrarr 中序

* @param root 前序遍歷的第乙個值即為根節點

* @return

*/public static treenode genetree(int dlrarr, int ldrarr, int root)

int midindex = getindex(ldrarr, dlrarr[0]);

if (0 == midindex)

if (midindex == ldrarr.length -1)

treenode.leftnode = genetree(arrays.copyofrange(dlrarr, 1, midindex + 1), arrays.copyof(ldrarr, midindex ), arrays.copyofrange(dlrarr, 1, midindex + 1)[0]);

treenode.rightnode = genetree(arrays.copyofrange(dlrarr, midindex + 1, dlrarr.length), arrays.copyofrange(ldrarr, midindex + 1, ldrarr.length), arrays.copyofrange(dlrarr, midindex + 1, dlrarr.length)[0]);

return treenode;

}

根據前序遍歷和中序遍歷重建二叉樹

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。class treenode public class s2 public treenode reconstruct int pre...

根據前序遍歷和中序遍歷重建二叉樹

package com.study 根據二叉樹的前序遍歷和中序遍歷結果重建二叉樹 並輸出其頭節點。假設前序遍歷和中序遍歷結果中沒有重複數字 前序遍歷序列 中序遍歷序列 class treenode public class suanfa4 private static int arr2 public...

根據前序遍歷和中序遍歷樹構造二叉樹

根據前序遍歷和中序遍歷樹構造二叉樹.樣例給出中序遍歷 1,2,3 和前序遍歷 2,1,3 返回如下的樹 2 1 3 假設樹中不存在相同數值的節點 definition of treenode class treenode class solution treenode helper vector p...