leetCode数据结构入门day 10 | 226.翻转二叉树 112.路径之和 700.二叉搜索树中的搜索 701. 二叉搜索树中的插入操作 98.验证二叉搜索树

文章介绍了如何使用递归方法来翻转二叉树,以及在二叉搜索树中进行搜索、插入和验证操作。翻转二叉树的两种递归策略——自上而下和自下而上,以及在路径之和问题中如何利用递归寻找特定路径。同时讨论了二叉搜索树的性质在搜索、插入和验证操作中的应用。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值