PigyChan_LeetCode 105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

难度中等

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。
例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]

返回如下的二叉树:
PigyChan_LeetCode 105. 从前序与中序遍历序列构造二叉树_第1张图片

思路1.0:

(1)遍历前序序列,并在每次遍历时在中序序列中找到当前访问值。
(2)设置队列,用以辅助我们一层一层地构造二叉树

思路2.0(已看题解):

(1)遍历前序序列,并在每次遍历时在中序序列中找到当前访问值的下标mid。
(2)中序序列中,mid左侧的所有值构成当前节点的左子树,左侧目前有的元素数量leftLen,
前序序列的右侧leftLen个值构成当前节点的左子树。
(3)中序序列中,mid右侧的所有值构成当前节点的右子树,右侧目前有的元素数量rightLen,
前序序列的右侧leftLen个值的 右边leftright个值构成当前节点的右子树

代码2.0(以看题解):

  class Solution {
  public:
      int findElement(vector<int> v, int key) {
          auto it=find(v.begin(), v.end(), key);


          if (it != v.end()) {
              return distance(v.begin(), it);
          }
          return -1;
      }


      TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
          if (inorder.size() == 0) return NULL;


          int val = preorder[0];
          TreeNode* TNode = new TreeNode(val);
          auto mid = findElement(inorder, val);


          vector<int> leftPre(preorder.begin() + 1, preorder.begin() + 1 + mid);
          vector<int> leftIn(inorder.begin(), inorder.begin()+mid);
          TNode->left = buildTree(leftPre, leftIn);


          vector<int> rightPre(preorder.begin() + 1 + mid, preorder.end());
          vector<int> rightIn(inorder.begin() + 1 + mid, inorder.end());
          TNode->right = buildTree(rightPre, rightIn);


          return TNode;
      }
  };


PigyChan_LeetCode 105. 从前序与中序遍历序列构造二叉树_第2张图片

思路3.0:

递归方法的效率有点低,这里尝试一下迭代的方法。

你可能感兴趣的:(LeetCode二叉树,二叉树,c++,leetcode)