LeetCode 95——不同的二叉搜索樹 II
阿新 • • 發佈:2018-11-21
size tco new struct leet nsh http 分享 strong ,這時候只需要遍歷另一個子樹即可。
1. 題目
2. 解答
以 \(1, 2, \cdots, n\) 構建二叉搜索樹,其中,任意數字都可以作為根節點來構建二叉搜索樹。當我們將某一個數字作為根節點後,其左邊數據將構建為左子樹,右邊數據將構建為右子樹。因此,這是一個遞歸問題。
假設序列為 \([begin, end]\),若以第 \(i\) 個數據為根節點,其左邊數據 \([begin, i-1]\) 可以構建出左子樹 left_tree,右邊數據 \([i+1, end]\) 可以構建出右子樹 right_tree。它們都存儲在一個向量中,因此,我們需要遍歷左右子樹所有可能的情況,分別構建二叉搜索樹。
其中要特別註意,如果某一個子樹向量為空,我們需要在向量中添加一個空指針,保證循環進行一次
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<TreeNode*> generateTrees(int n) { return generateTrees(1, n); } vector<TeeNode*> generateTrees(int begin, int end) { vector<TreeNode*> all_tree; vector<TreeNode*> left_tree; vector<TreeNode*> right_tree; TreeNode *tree = NULL; if (begin > end) return all_tree; for (int i = begin; i <= end; i++) { left_tree = generateTrees(begin, i - 1); right_tree = generateTrees(i + 1, end); // 左右子樹如果為空的話需要循環一次 if (left_tree.size() == 0) left_tree.push_back(NULL); if (right_tree.size() == 0) right_tree.push_back(NULL); for (int j = 0; j < left_tree.size(); j++) { for (int k = 0; k < right_tree.size(); k++) { tree = new TreeNode(i); // 每次都需要建一個新樹 tree->left = left_tree[j]; tree->right = right_tree[k]; all_tree.push_back(tree); } } } return all_tree; } };
獲取更多精彩,請關註「seniusen」!
LeetCode 95——不同的二叉搜索樹 II