1.二叉樹的中序遍歷
給定一個二叉樹,返回它的中序遍歷
思路:遞歸
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
inorder(root, res);
return res;
}
void inorder(TreeNode* root, vector<int>& res)
{
if(root == nullptr)
{
return;
}
inorder(root -> left, res);
res.push_back(root -> val);
inorder(root -> right, res);
}
非遞歸:用棧來做
- 從跟節點一直往左走,將經過的所有節點壓棧
- 棧不空則出棧,將出棧節點添加到結果中並轉向該節點的右子樹
- 棧空則重複執行上述步驟
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> s;
TreeNode* cur = root;
while(cur != nullptr || !s.empty())
{
while(cur != nullptr)
{
s.push(cur);
cur = cur -> left;
}
if(!s.empty())
{
cur = s.top();
s.pop();
res.push_back(cur -> val);
cur = cur -> right;
}
}
return res;
}
2.不同的二叉搜索樹II
給定一個整數n,生成所有由1…n爲節點所組成的二叉搜索樹
思路:
- 二叉樹一共有多少種?
- 假設給定n = 1,結果只有一種
- 當n > 1時,根爲i(2 ≤ i ≤ n)的情況,定義函數f(n),返回以n爲輸入的二叉樹的個數。左邊二叉樹的數目是f(i - 1),右邊二叉樹的個數是f(n - i),共有f(i - 1) * f(n - i)情況
- 以不同的數作爲root,分別在i左邊和右邊構成二叉樹,並排列組合,這便是遞歸過程
vector<TreeNode*> generateTrees(int n) {
if(n == 0)
{
return {};
}
return generate(1, n);
}
vector<TreeNode*> generate(int left, int right)
{
if(left > right)
{
return {nullptr};
}
vector<TreeNode*> res;
for(int i = left; i <= right; i++)
{
vector<TreeNode*> left_nodes = generate(left, i - 1);
vector<TreeNode*> right_nodes = generate(i+ 1, right);
for(int j = 0; j < left_nodes.size(); j++)
{
for(int k = 0; k < right_nodes.size(); k++)
{
TreeNode* root = new TreeNode(i);
root -> left = left_nodes[j];
root -> right = right_nodes[k];
res.push_back(root);
}
}
}
return res;
}