題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。
例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。
題目來源: 牛客網
思路: 遞歸構建二叉樹
代碼示例:
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)
return NULL;
TreeNode* root = new TreeNode(pre[0]);
//根節點給好之後, 在中序序列中找到根節點的下標, 確定根節點的左右子樹序列
int i;
for (i = 0; i < vin.size() && vin[i] != pre[0]; ++i);
//該for循環跳出之後則找到根節點在中序序列中的下標
vector<int> pre_left, in_left, pre_right, in_right;
int pre_i = 1;//每次循環pre序列中的第一個值做根
//從下標爲1的值開始區分根節點的左右子樹
for (int j = 0; j < vin.size(); ++j)
{
if (j < i)
{
in_left.push_back(vin[j]);
pre_left.push_back(pre[pre_i]);
pre_i++;
}
else if (j > i)
{
in_right.push_back(vin[j]);
pre_right.push_back(pre[pre_i]);
pre_i++;
}
}
//遞歸左子樹
root->left = reConstructBinaryTree(pre_left, in_left);
//遞歸右子樹
root->right = reConstructBinaryTree(pre_right, in_right);
return root;
}
};