认识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

LeetCode 树_i++

看样例发现所有中序遍历后都是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. 相同的树

LeetCode 树_i++_02

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

}