本博文是原創博文,轉載請注明出處!
# 本文為牛客網《劍指offer》刷題筆記
1.題目
# 輸入某二叉樹的前序遍歷和中序遍歷的結果,重建二叉樹
2.思路(遞歸)
# 前序遍歷中,第一個數字是二叉樹的根節點
# 中序遍歷中,根節點的左側是左子樹的節點,根節點的右側是右子樹的節點。
3.code
# 返回值:指向二叉樹節點的指針
# 函數參數:前序遍歷結果vector,中序遍歷結果vector
/**
* Definition for binary tree
* 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.empty()||vin.empty())
return nullptr;
// 建立根節點
TreeNode *head = new TreeNode(pre[0]);
// 查找中序遍歷中根節點的索引值
int root=0;
for(int i = 0;i<pre.size();++i)
{
if(vin[i] == pre[0])
{
root = i;
break;
}
}
// 先序遍歷和中序遍歷的左右子樹vector
vector<int> pre_left,pre_right,vin_left,vin_right;
for(int i =0;i<root;++i)
{
pre_left.push_back(pre[i+1]);
vin_left.push_back(vin[i]);
}
for(int i = root+1;i<pre.size();++i)
{
pre_right.push_back(pre[i]);
vin_right.push_back(vin[i]);
}
// 根節點的左右節點
head->left = reConstructBinaryTree(pre_left,vin_left);
head->right = reConstructBinaryTree(pre_right,vin_right);
return head;
}
};
4.復雜度
時間復雜度O(logn),空間復雜度n/2
5.測試用例
# 空二叉樹
# 只有一個節點的二叉樹
# 只有左子節點的二叉樹
# 只有右子節點的二叉樹
# 完全二叉樹和不完全二叉樹
