226.翻转二叉树(我的递归写的不对啊救命)
想到的递归(自上而下递归):
- 终止条件:当前节点为
null
时返回 - 交换当前节点的左右节点,再递归的交换当前节点的左节点,递归的交换当前节点的右节点
TreeNode* invertTree(TreeNode*root){
if(root==nullptr){
return root;
}
TreeNode*t=root->left;
root->left=root->right;
root->right=t;
invertTree(root->left);
invertTree(root->right);
return root;
}
不一定要写两个函数,注意传入递归的是几个参数。
官方标解(自下而上递归):
从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转。
如果当前遍历到的节点 root的左右两棵子树都已经翻转,那么我们只需要交换两棵子树的位置,即可完成以 root为根节点的整棵子树的翻转。
TreeNode* invertTree(TreeNode* root) {
if (root == nullptr) {
return nullptr;
}
TreeNode* left = invertTree(root->left);
TreeNode* right = invertTree(root->right);
root->left = right;
root->right = left;
return root;
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/invert-binary-tree/solution/fan-zhuan-er-cha-shu-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
112.路径之和
1.递归
是否有从「根节点」到某个「叶子节点」经过的路径上的节点之和等于目标和。
假定从根节点到当前节点的值之和为 val
,将这个大问题转化为一个小问题:是否存在从当前节点的子节点到叶子的路径,满足其路径和为 sum - val
。
bool hasPathSum(TreeNode *root, int sum) {
if (root == nullptr) {
return false;
}
if (root->left == nullptr && root->right == nullptr) {
return sum == root->val;
}
return hasPathSum(root->left, sum - root->val) ||
hasPathSum(root->right, sum - root->val);
}
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/path-sum/solution/lu-jing-zong-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
700.二叉搜索树中的搜索
二叉搜索树满足如下性质:
- 左子树所有节点的元素值均小于根的元素值;
- 右子树所有节点的元素值均大于根的元素值。
-
若 rootroot 为空则返回空节点;
若 val=root.valval=root.val,则返回 rootroot;
若 val<root.valval<root.val,递归左子树;
若 val>root.valval>root.val,递归右子树。(关键,否则会超出时间限制)
701. 二叉搜索树中的插入操作
我的考虑:4 75 插入6 6应该插进57之间
天哪 我真的真的写不好递归哭了 QWQ
问题关键是,二叉搜索树的插入,总是存在一个不需调整树结构,就能插入新节点的方法。
递归版:
TreeNode* insertIntoBST(TreeNode*root,int val){
if(root==null){
return newTreeNode(val);
}
if(root->val<val){
root->right=insertIntoBST(root->right,val);
}else{
root->right=insertIntoBST(root->left,val);
}
return root;
}
迭代版:
TreeNode*insertIntoBST(TreeNode*root,int val){
if(root==null){
return new TreeNode(val);
}
TreeNode*parent=root,p=root;
while(p!=nullptr){
parent=p;
p=p->val<al?p->right:p->left;
}
if(parent->val<val){
parent->right=new TreeNode(val);
parent->left=new TreeNode(val);
}
return root;
}
98.验证二叉搜索树
!!!!!!!中序遍历!!!!!!!
判断当前节点是否大于中序遍历的前一个节点,如果大于,说明满足 BST,继续遍历;否则直接返回 false。
long pre=Long.MIN_VALUE;
bool isValidBST(TreeNode*root){
if(!root){
return true;
}
if(!isValidBST(root->left)){
return false;
}
if(root->val<=pre){
return false;
}
pre=eroot->val;
return isValidBST(root->right);
}