1. 程式人生 > >C++ 前序遍歷和中序遍歷重構二叉樹(劍指offer)

C++ 前序遍歷和中序遍歷重構二叉樹(劍指offer)

題目描述

輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。

這道題之前做過幾次,以前的做法比較粗暴,每次都會申請新的空間儲存前序遍歷和中序遍歷進行遞迴,這次做了一些改進,用兩個指標記錄新的中序遍歷前後端進行遞迴,可以節省空間。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    
    void construct_tree(TreeNode *&node, vector<int> pre, vector<int> vin, int left, int right, int &i)
    {
        if (i >= (int)pre.size())
        {
            return;
        }
        int k = left;
        for (;k <= right; k++)
        {
            if (pre[i] == vin[k])
            {
                break;
            }
        }
        node = new TreeNode(pre[i]);
        if (k > left)
        {
            i++;
            construct_tree(node->left, pre, vin, left, k-1, i);
        }
        if (right > k)
        {
            i++;
            construct_tree(node->right, pre, vin, k+1, right, i);
        }
    }
    
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        
        TreeNode* root;
        if (pre.size() == 0)
        {
            return NULL;
        }
        int i = 0;
        construct_tree(root, pre, vin, 0, vin.size() - 1, i);
        return root;
    }
};

這裡要注意的是

void construct_tree(TreeNode *&node, vector<int> pre, vector<int> vin, int left, int right, int &i)

這裡我用了指標引用,這裡折騰了我好久,因為以前都直接用指標,用指標引用比較少。用指標傳遞返回結果為空。大家可以試試。