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

代码:
/**

  • 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 &porder, vector &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 linorder;
vector rinorder;
vector rporder;
vector 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  阅读(109)  评论(0)    收藏  举报

导航