本博文是原創博文,轉載請注明出處!
# 本文為牛客網《劍指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.測試用例
# 空二叉樹
# 只有一個節點的二叉樹
# 只有左子節點的二叉樹
# 只有右子節點的二叉樹
# 完全二叉樹和不完全二叉樹