bosthhe1 / cpushpush

0 stars 0 forks source link

利用前序中序,或者中序后序构建二叉树 #28

Open bosthhe1 opened 1 year ago

bosthhe1 commented 1 year ago

这种我们的思想是,利用前序确认节点,利用中序确定范围,因为前序是一定的,是按照顺序的,这个东西说起来比较抽象,中序其实就是拿来区分左右期间和确认返回值的,这个中序区间和归并排序有一些相似,我们用前序为例子,因为前序是先跟再左子树右子树,所以前序遍历我们一定知道跟节点的位置,中序就区分左右子树,因为前序总是按照顺序走的(就是先构建左,后构建右),所以只需要确认返回条件就能构建树,只要没有遇到返回条件,就一直构建下去,遇到返回条件就return回来,链接上

bosthhe1 commented 1 year ago
    TreeNode* _buildTree(int &root,int left,int right,vector<int>& preorder, vector<int>& inorder)
    {
        if(left>right)
        return nullptr;
        int rooti = left;
        TreeNode* Node = new TreeNode(preorder[root]);
        while(preorder[root]!=inorder[rooti]&&rooti<right)
        {
            rooti++;//rooti将区间分为[left,rooti-1],rooti,[rooti+1,right];
        }
        ++root;//前序顺序是一定的,只需要一直++;
        Node->left = _buildTree(root,left,rooti-1,preorder, inorder);//调整插入的位置
        Node->right = _buildTree(root,rooti+1,right,preorder, inorder);
        return Node;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int root = 0;//前序的跟节点为0
        int left = 0;
        int right = preorder.size()-1;
        return _buildTree(root,left,right,preorder, inorder);
    }