LeetCode 刷题【94. 二叉树的中序遍历、95. 不同的二叉搜索树 II】
94. 二叉树的中序遍历
自己做
解:迭代解法(栈)
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode *> s; //结点栈vector<int> res; //存放结果TreeNode *p = root; //遍历指针while(p != nullptr){ //从根节点出发一路向左s.push(p); p = p->left;}while(!s.empty()){ //逐步出栈p = s.top();s.pop();res.push_back(p->val);//遍历右子树p = p->right;while(p != nullptr){s.push(p); p = p->left; }}return res;}
};
95. 不同的二叉搜索树 II
自己做【歇菜】
看题解
官方题解如下:
解:枚举回溯
class Solution {
public:vector<TreeNode*> generateTrees(int start, int end) {if (start > end) {return { nullptr };}vector<TreeNode*> allTrees;// 枚举可行根节点for (int i = start; i <= end; i++) {// 获得所有可行的左子树集合vector<TreeNode*> leftTrees = generateTrees(start, i - 1);// 获得所有可行的右子树集合vector<TreeNode*> rightTrees = generateTrees(i + 1, end);// 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上for (auto& left : leftTrees) {for (auto& right : rightTrees) {TreeNode* currTree = new TreeNode(i);currTree->left = left;currTree->right = right;allTrees.emplace_back(currTree);}}}return allTrees;}vector<TreeNode*> generateTrees(int n) {if (!n) {return {};}return generateTrees(1, n);}
};