【劍指offer】07重建二叉樹,C++實現


本博文是原創博文,轉載請注明出處!

# 本文為牛客網《劍指offer》刷題筆記

1.題目

# 輸入某二叉樹的前序遍歷和中序遍歷的結果,重建二叉樹

2.思路(遞歸)

# 前序遍歷中,第一個數字是二叉樹的根節點

# 中序遍歷中,根節點的左側是左子樹的節點,根節點的右側是右子樹的節點。

3.code

# 返回值:指向二叉樹節點的指針

# 函數參數:前序遍歷結果vector,中序遍歷結果vector

/**
 * 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* reConstructBinaryTree(vector<int> pre,vector<int> vin)
    {
        // 遞歸出口
        if(pre.empty()||vin.empty())
            return nullptr;
        
        // 建立根節點
        TreeNode *head = new TreeNode(pre[0]);
        
        // 查找中序遍歷中根節點的索引值
        int root=0;
        for(int i = 0;i<pre.size();++i)
        {
            if(vin[i] == pre[0])
            {
                root = i;
                break;
            }
        }
        // 先序遍歷和中序遍歷的左右子樹vector
        vector<int> pre_left,pre_right,vin_left,vin_right;
        
        for(int i =0;i<root;++i)
        {
            pre_left.push_back(pre[i+1]);
            vin_left.push_back(vin[i]);
        }
        
        for(int i = root+1;i<pre.size();++i)
        {
            pre_right.push_back(pre[i]);
            vin_right.push_back(vin[i]);
        }
        
        // 根節點的左右節點
        head->left = reConstructBinaryTree(pre_left,vin_left);
        head->right = reConstructBinaryTree(pre_right,vin_right);
        
        return head;
    }
};

  

4.復雜度

時間復雜度O(logn),空間復雜度n/2

5.測試用例

# 空二叉樹

# 只有一個節點的二叉樹

# 只有左子節點的二叉樹

# 只有右子節點的二叉樹

# 完全二叉樹和不完全二叉樹

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM