剑指offer 牛客网 重建二叉树

36 阅读1分钟

重建二叉树__牛客网 (nowcoder.com)


  TreeNode* reConstructBinaryTree(vector<int> pre, vector<int> in) {
  
    vector<int> inleft, preleft, inright, preright;
    vector<int>::iterator it;
    vector<int>::iterator i;


    //找到root节点
    int root = pre[0];
    TreeNode* node = new TreeNode(root);



    //判断结束条件
    if (pre.size() == 0 || in.size() == 0) {
      return NULL;
    }


    for (it = in.begin(); it != in.end(); it++) {
      if (root == *it) {
        i = it;
      }
    }

    //中序遍历,找到root



    int k = 0;
    for (it = in.begin(); it != in.end(); it++) {
      if (k == 0) {
        inleft.push_back(*it);
      } else if (k == 1) {
        inright.push_back(*it);
      } else {}
      if (it == i) {
        k = 1;
      }
    }

    //开始分别重构左子树,右子树。
    //怎么构造呢,用递归的方法:
    //递归之前要先明白,我们给左子树递归是传的左子树的左孩子,右孩子,给右子树递归,传的是右子树的左孩子有孩子



    k = 0;
    vector<int>::iterator ite;
    for (it = pre.begin() + 1; it != pre.end(); it++) {
      for (ite = inleft.begin(); ite != inleft.end(); ite++) {
        if (*it == *ite) {
          preleft.push_back(*it);
          k = 1;
        }
      }
      if (k == 0) {
        preright.push_back(*it);
      }
      k = 0;
    }


    node->left = reConstructBinaryTree(preleft,inleft);
        node->right = reConstructBinaryTree(preright,inright);

    return node;

  }

};