题解 | #牛群的树形结构重建#
牛群的树形结构重建
https://www.nowcoder.com/practice/bcabc826e1664316b42797aff48e5153
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param inOrder int整型vector
* @param postOrder int整型vector
* @return TreeNode类
*/
TreeNode* buildTree(vector<int>& inOrder, vector<int>& postOrder) {
int postLen = postOrder.size();
int inLen = inOrder.size();
// 处理边界情况
if (postLen == 0 || inLen == 0 || postLen != inLen) {
return nullptr;
}
// 后序遍历数组的最后一个元素为根节点
TreeNode* root = new TreeNode(postOrder[postLen - 1]);
// 在中序遍历数组中找到根节点的位置
int rootIndex = 0;
for (int i = 0; i < inLen; i++) {
if (inOrder[i] == root->val) {
rootIndex = i;
break;
}
}
// 构建左子树和右子树的中序遍历数组
vector<int> leftInorder(inOrder.begin(), inOrder.begin() + rootIndex);
vector<int> rightInorder(inOrder.begin() + rootIndex + 1, inOrder.end());
// 构建左子树和右子树的后序遍历数组
vector<int> leftPostorder(postOrder.begin(), postOrder.begin() + rootIndex);
vector<int> rightPostorder(postOrder.begin() + rootIndex, postOrder.end() - 1);
// 递归构造左子树和右子树
root->left = buildTree(leftInorder, leftPostorder);
root->right = buildTree(rightInorder, rightPostorder);
return root;
// write code here
}
};
