二叉樹有前序、中序、後序、層次四種遍歷方式。
層次遍歷我們就不考慮,因爲比較簡單。
我們一般是根據前序和中序、中序和後序這兩種方式來重建二叉樹,注意必須要有中序序列才能唯一確定一棵樹。無論是前序和中序、中序和後序構建思路都是一致的。
重建的思路是採用迭代的思想:
比如依照前序和中序
1.我們設定一個函數,把前序和中序傳進來,通過前序找到當前的根,並返回根。
2.在返回根之前,根據中序能知道根的左右子樹分別包含哪些數字,我們就把根左邊部分的中序和前序傳給函數並獲取返回值,將該返回值賦給當前節點的left指針;
3.根的right指針同理,根據根右邊部分的中序和前序獲取返回值;
4.重複上述過程,迭代結束就能獲取一棵完整的樹。
代碼如下:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
if(pre.size()==0 || vin.size()==0)
return NULL;
int root=pre[0];
vector<int> left_pre,left_vin,right_pre,right_vin;
bool find_root=false;
for(int i=0;i<vin.size();i++)
{
if(vin[i]==root)//找到根節點
{
find_root=true;
continue;
}
if(find_root)
right_vin.push_back(vin[i]);//右子樹中序
else
left_vin.push_back(vin[i]);//左子樹中序
}
for(int i=1;i<pre.size();i++)
{
if(left_pre.size()!=left_vin.size())
left_pre.push_back(pre[i]);//左子樹前序
else
right_pre.push_back(pre[i]);//右子樹前序
}
TreeNode *head=new TreeNode(root);
head->left=reConstructBinaryTree(left_pre,left_vin);
head->right=reConstructBinaryTree(right_pre,right_vin);
return head;
}
};