輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
分析:二叉樹的前序遍歷順序是:先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹。
中序遍歷順序是:中序遍歷根節點的左子樹,然後是訪問根節點,最後中序遍歷右子樹。
1、二叉樹的前序遍歷序列一定是該樹的根節點
2、中序遍歷序列中根節點前面一定是該樹的左子樹,後面是該樹的右子樹
從上面可知,題目中前序遍歷的第乙個節點一定是這棵二叉樹的根節點,根據中序遍歷序列,可以發現中序遍歷序列中節點之前的是這棵二叉樹的左子樹,是這棵二叉樹的右子樹。然後,對於左子樹,遞迴地把前序子串行和中序子串行看成新的前序遍歷和中序遍歷序列。此時,對於這兩個序列,該子樹的根節點是,該子樹的左子樹為、右子樹為空,如此遞迴下去(即把當前子樹當做樹,又根據上述步驟分析)。這棵右子樹的分析也是這樣。
**如下:
package zhm.day1;
/** *
* 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。 假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
* 例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
* * @author zhm
* */
public class constructbinarytree
return btconstruct(pre, in, 0, plen - 1, 0, ilen - 1);
} /**
* 構建方法,pstart和pend分別是前序遍歷序列陣列的第乙個元素和最後乙個元素;
* istart和iend分別是中序遍歷序列陣列的第乙個元素和最後乙個元素。
* * @param pre
* @param in
* @param pstart
* @param pend
* @param istart
* @param iend
* @return
*/private treenode btconstruct(int pre, int in, int pstart, int pend,
int istart, int iend)
} // 4.劃分左右子樹
int leftlength = rootindex - istart;// 左子樹
int rightlength = iend - rootindex;// 右子樹
// 5.遍歷左子樹
if (leftlength > 0)
// 6.遍歷右子樹
if (rightlength > 0)
return root;
} public static void main(string args) ;
int in = ;
constructbinarytree constructbinarytree = new constructbinarytree();
treenode node = constructbinarytree.reconstructbinarytree(pre, in);
system.out.println(node);
}}
劍指 重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。前序 根左右,中序 左根右 題中例子 前序遍歷1為根,中序遍歷的4,7,2即為左子樹,5,3,8,6即為右子樹 左子樹前序遍歷為2,...
劍指offer 重建二叉樹
重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...
《劍指offer》重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如,則重建二叉樹並返回。輸入乙個樹的前序和中序,例如輸入前序遍歷序列和中序遍歷序列 根據輸入的前序和中序,重建乙個該二叉樹,並返回該樹的根節點。definition for binary...