前序遍历和中序遍历树构造二叉树

代码:
/**

  • Definition of TreeNode:
  • class TreeNode {
  • public:
  • int val;
    
  • TreeNode *left, *right;
    
  • TreeNode(int val) {
    
  •     this->val = val;
    
  •     this->left = this->right = NULL;
    
  • }
    
  • }
    */

class Solution {
/**
*@param preorder : A list of integers that preorder traversal of a tree
*@param inorder : A list of integers that inorder traversal of a tree
*@return : Root of a tree
*/
public:
TreeNode *buildTree(vector &preorder, vector &inorder) {
// write your code here

    int len1 = preorder.size();
    int len2 = inorder.size();
    if (len1 <= 0 || len2 <= 0) {
        return nullptr;
    }
    return  dp(preorder,inorder);

    
}
TreeNode *dp(vector<int> &porder, vector<int> &iorder) { 
    int len1 = porder.size();
    int len2 = iorder.size();
    if (len1 <= 0 || len2 <= 0) {
        return nullptr;
    }
   
 TreeNode *root = new TreeNode();
    root->val=porder[0];
    if (len1 ==1 || len2 ==1) {
        return root;
    }
    int r=0;
    for (int i = 0; i < len1 ; ++i) {
        if (iorder[i] == root->val) {
            r = i;
            break;
        }
    }
    vector<int> linorder;
    vector<int> rinorder;
    vector<int> rporder;
    vector<int> lporder;
     for (int i = 0; i < r ; ++i) {
         linorder.push_back(iorder[i]);
     }
     for (int i = r+1; i < len2 ; ++i) {
         rinorder.push_back(iorder[i]);
     }
      for (int i = 1; i <= r ; ++i) {
         lporder.push_back(porder[i]);
     }
      for (int i = r+1; i <= len1; ++i) {
         rporder.push_back(porder[i]);
     }
    
     root->left =dp(lporder,linorder);
     root->right =dp(rporder,rinorder);
     return root;
}

};

posted on 2017-08-17 23:06  p666  阅读(100)  评论(0编辑  收藏  举报

导航