程序员面试金典——面试题 04.09. 二叉搜索树序列

一、题目介绍

从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树,输出所有可能生成此树的数组。

示例:
给定如下二叉树

        2
       / \
      1   3
返回:

[
   [2,1,3],
   [2,3,1]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bst-sequences-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

       本题相当于变相考察全排列,采用的方式为“回溯+递归+双端队列”,该方法自己没有想出来,借鉴他人的,在这里记录一下。

三、解题代码

class Solution {
public:
    vector<vector<int>> BSTSequences(TreeNode* root) {
        vector<vector<int>> res;
        if(!root)
            return {
   
   {}};
        vector<int> ans;
        deque<TreeNode*> q;
        q.push_back(root);
        dfs(ans, res, q);
        return res;
    }

    void dfs(vector<int>& ans, vector<vector<int>> &res, deque<TreeNode*>& q)
    {
        if(q.empty())
        {
            res.push_back(ans);
            return;
        }
        for(int i = q.size(); i > 0; --i)
        {
            TreeNode* cur = q.front();
            q.pop_front();
            ans.push_back(cur->val);
            int count = 0;
            if(cur->left)
            {
                q.push_back(cur->left);
                ++count;
            }
            if(cur->right)
            {
                q.push_back(cur->right);
                ++count;
            }
            dfs(ans, res, q);
            for(int j = 0; j < count; ++j)
                q.pop_back();
            
            ans.pop_back();
            q.push_back(cur);
        }
    }
};

四、解题结果

猜你喜欢

转载自blog.csdn.net/qq_39661206/article/details/108143175