重建二叉樹(前序和中序重建,後序和中序重建)

重建二叉樹(前序中序,後序中序)

重建二叉樹
在這裏插入圖片描述

根據前序和中序構建二叉樹:

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
   
   
public:
    int index=0;
    TreeNode* rebuild(vector<int> pre,vector<int> vin, int left, int right)
    {
   
   
        if(left==right || pre.size()==index)
        {
   
   
            return nullptr;
        }
        TreeNode *head=NULL;
        for(int i=left;i<right; i++)
        {
   
   
            if(pre[index]==vin[i])//查找分界點
            {
   
   
                
                head=new TreeNode(pre[index]);
                index++;
                head->left=rebuild(pre, vin,  left, i);
                head->right=rebuild(pre,  vin, i+1, right);
                break;
            }
        }
        return head;
        
    }
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
   
   
        int left=0;
        int right=vin.size();
        TreeNode* head=rebuild(pre,vin,left,right);
        return head;
    }
};

根據中序和後序構建二叉樹(注:pre暫爲後序遍歷):
後序pre:[3,4,2,6,7,5,1]
中序vin:[3,2,4,1,6,5,7]
在這裏插入圖片描述


/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
   
   
public:
    
    TreeNode* rebuild(vector<int> pre,vector<int> vin, int prel, int prer,int vinl,int vinr)
    {
   
   
        if(left==right)
        {
   
   
            return nullptr;
        }
        TreeNode *head=NULL;
        for(int i=vinl;i<=vinr; i++)
        {
   
   
            if(pre[prer]==vin[i])//查找中序遍歷vin分界點i ,左邊左子樹,右邊右子樹
            {
   
   
                
                head=new TreeNode(pre[prer]);//構建根節點
                
                head->left=rebuild(pre, vin, prel,i-vinl-1+prel,vinl,i-1);//pre【prel,i-vinl-1+prel】和vin【vinl,i-1】構建左子樹
                head->right=rebuild(pre,  vin, prel+i-vinl, prer-1,i+1,vinr);//pre【prel+i-vinl, prer-1l】和vin【i+1,vinr】構建左子樹
                break;
            }
        }
        return head;
        
    }
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
   
   
        TreeNode* head=rebuild(pre,vin,0,pre.size()-1,0,vin.size()-1);
        return head;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章