由一個前序以及中序遍歷重建一顆二叉樹
經典二叉樹題目,由前序遍歷可知前序遍歷的第一個數爲當前樹的頭結點;
得知當前樹的頭結點後,由中序遍歷可知左右子樹的節點數量;
這樣可以將前序遍歷,去除頭結點後,分爲兩部分,兩部分的第一個數分別爲左右子樹的頭結點;
遞歸實現,根據函數輸入不同有不同寫法,大體算法一致
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
struct TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> in) {
int head=pre[0];
int lenl,lenr;
int i,j;
vector<int> left_pre,left_in,right_pre,right_in;
TreeNode *node = new TreeNode(head); //新建樹
for(i=0;in[i]!=head && i<in.size();i++); //在中序遍歷中尋找頭結點位置
lenl=i; //左子樹節點數
lenr=in.size()-i-1; //右子樹節點數
for(j=0;j<i;j++){ //將左子樹前、中序遍歷放入新vector中
left_pre.push_back(pre[j+1]); //注意此處,前序遍歷要去除當前頭結點
left_in.push_back(in[j]);
}
for(j=i+1;j<in.size();j++){ //將右子樹前、中序遍歷放入新vector中,注意兩個循環
right_pre.push_back(pre[j]);
right_in.push_back(in[j]);
}
if(lenl>0) node->left=reConstructBinaryTree(left_pre,left_in); //遞歸建立左子樹
if(lenr>0) node->right=reConstructBinaryTree(right_pre,right_in); //遞歸簡歷右子樹
return node;
}
};