题解 | #重建二叉树#
重建二叉树
https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* @param preOrder int整型vector
* @param vinOrder int整型vector
* @return TreeNode类
*/
//参数解释:begin_preOrder:先序遍历起始索引 end_preOrder:先序遍历序列结尾索引 其余类推
TreeNode* build_node(vector<int>& preOrder, vector<int>& vinOrder,
int begin_preOrder, int end_preOrder, int begin_vinOrder,
int end_vinOrder) {
//递归终止条件 若当前先序遍历索引或中序遍历索引参数 首大于尾 则表示遇到了非全孩子节点 直接返回对应空值
if (begin_preOrder > end_preOrder || begin_vinOrder > end_vinOrder) {
return nullptr;
}
//根据先序序列的起始索引值 构建二叉树节点
TreeNode* root = new TreeNode(preOrder[begin_preOrder]);
int k = begin_vinOrder;
//找到当前先序遍历节点在中序遍历中的位置
for (; k <= end_vinOrder; k++) {
if (vinOrder[k] == preOrder[begin_preOrder]) {
break;
}
}
//显然,在中序遍历中,k的左侧全为当前节点的左子树,k的右侧为当前节点的右子树
//故节点k的左子树数目为k-begin_vimOrder,在先序遍历中当前已构造节点(k节点)的左子树索引从begin_preOrder+1开始,至begin_preOrder + k - begin_vinOrder结束
//确定边界后递归构建当前节点的左子树
root->left = build_node(preOrder, vinOrder,
begin_preOrder + 1, begin_preOrder + k - begin_vinOrder , begin_vinOrder,
k - 1);
//同理类推先序遍历中当前已构造节点的右子树索引起始范围
//确定边界后递归构建当前节点的右子树
root->right = build_node(preOrder, vinOrder,
begin_preOrder+k-begin_vinOrder+1, end_preOrder, k + 1, end_vinOrder);
//每层返回已构建好的节点
return root;
}
TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {
// write code here
TreeNode* root = build_node(preOrder, vinOrder, 0, preOrder.size() - 1, 0,
vinOrder.size() - 1);
return root;
}
};
查看12道真题和解析
OPPO公司福利 1202人发布