考研算法 2022.3.6

113 阅读1分钟

考研算法

题目

题目链接

题目要求

根据中序前序列表重建二叉树

代码

/**
 * 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

知识点

对于前序的第一个点就是当前二叉树的根节点
而中序则根据这个根节点从两边分为了左子树和右子树
然后分别递归进入左子树和右子树寻找新的根节点
知道前序遍历结束 image.png

C++ new

new返回一个指针
C/C++中new的使用规则 - 夜_归_人 - 博客园 (cnblogs.com)

python index

inorder.index(preorder[0])返回对应的索引值