考研算法
题目
题目要求
根据中序前序列表重建二叉树
代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
unordered_map<int,int> hax;
vector<int> preorder,inorder;
TreeNode* build(int a,int b,int x,int y)
{
if (a>b) return NULL;
TreeNode* root=new TreeNode(preorder[a]);
int k=hax[preorder[a]];
root->left=build(a+1,k-x+a,x,k-1);
root->right=build(k-x+a+1,b,k+1,y);
return root;
}
TreeNode* buildTree(vector<int>& _preorder, vector<int>& _inorder) {
preorder=_preorder;
inorder=_inorder;
int n=_preorder.size();
for(int i=0;i<n;i++)
{
hax[inorder[i]]=i;
}
return build(0,n-1,0,n-1);
}
};
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def buildTree(self, preorder, inorder):
"""
:type preorder: List[int]
:type inorder: List[int]
:rtype: TreeNode
"""
if len(preorder)==0 :return None
k=inorder.index(preorder[0])
root=TreeNode(preorder[0])
root.left=self.buildTree(preorder[1:k+1],inorder[:k])
root.right=self.buildTree(preorder[k+1:],inorder[k+1:])
return root
知识点
对于前序的第一个点就是当前二叉树的根节点
而中序则根据这个根节点从两边分为了左子树和右子树
然后分别递归进入左子树和右子树寻找新的根节点
知道前序遍历结束
C++ new
new返回一个指针
C/C++中new的使用规则 - 夜_归_人 - 博客园 (cnblogs.com)
python index
inorder.index(preorder[0])返回对应的索引值