认识LeetCode树的定义方式
/**
* 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) {}
* };
*/
94. 二叉树的中序遍历
简单的递归写法
vector <int>ans;
vector<int> inorderTraversal(TreeNode* root) {
dfs(root);
return ans;
}
void dfs(TreeNode* root)
{
if(!root)return ;
dfs(root->left);
ans.push_back(root->val);
dfs(root->right);
}
迭代写法 待更
95. 不同的二叉搜索树 II
看样例发现所有中序遍历后都是1 、2 、3 、...、n的形式
当我们以k为根节点时,会不会发现 k的 左子树的编号从1到 k-1 啊,右子树 k+1 到 n 啊?
会!
所以 对于区间[l , r] 枚举根节点 k 计算出左子树 右子树 再拼上就是答案啦!
vector<TreeNode*> generateTrees(int n) {
return dfs(1,n);//学习自AcWing
}
vector<TreeNode*>dfs(int l,int r)
{
vector<TreeNode*>res;
if(l>r)//说明它没有左子树或右子树咯
{
res.push_back(nullptr);//NULL
return res;
}
for(int i=l;i<=r;i++)//子树必是连续的一段 枚举根节点i
{
auto left=dfs(l,i-1),right=dfs(i+1,r);//枚举 以i为根节点 所有左子树 右子树
for(auto le: left)
{
for(auto ri: right)
{
auto x=new TreeNode(i);//根节点
//TreeNode(i,le,ri);
x->left=le,x->right=ri;
res.push_back(x);
}
}
}
return res;
}
100. 相同的树
bool isSameTree(TreeNode* p, TreeNode* q) {
if(!p&&!q)return true;
if(!p)return false;
if(!q)return false;
if(p->val!=q->val)return false;
return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}