leetcode—5/31

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);
    }

非遞歸:用棧來做

  1. 從跟節點一直往左走,將經過的所有節點壓棧
  2. 棧不空則出棧,將出棧節點添加到結果中並轉向該節點的右子樹
  3. 棧空則重複執行上述步驟
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爲節點所組成的二叉搜索樹

思路:

  1. 二叉樹一共有多少種?
  • 假設給定n = 1,結果只有一種
  • 當n > 1時,根爲i(2 ≤ i ≤ n)的情況,定義函數f(n),返回以n爲輸入的二叉樹的個數。左邊二叉樹的數目是f(i - 1),右邊二叉樹的個數是f(n - i),共有f(i - 1) * f(n - i)情況
  1. 以不同的數作爲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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章