题解 | #重建二叉树#

重建二叉树

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;
    }
};

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务