首页 > 其他分享 >[刷题记录Day22]Leetcode二叉树

[刷题记录Day22]Leetcode二叉树

时间:2023-08-27 14:33:28浏览次数:40  
标签:TreeNode 递归 val Leetcode 二叉树 return Day22 root 节点

No.1

题目

二叉搜索树的最近公共祖先

思路

  • 递归法
  • BST特性如何利用?在BST中,公共祖先一定在p、q数值范围的中间
  • 利用BST特性定向搜索
  • 注意递归遍历一条边和遍历整棵树的写法不同

递归分析

  1. 返回值:节点,参数:当前节点,p,q
  2. 终止逻辑:发现当前节点为空,则直接返回当前节点;
    1. 为什么不用判断p和q与root值的情况?因为不需要遍历到p和q实际的值,通过范围的剪枝就可以找到p、q的方向
  3. 单层递归分析:p、q都大于当前节点,则向右子树搜索;p、q都小于当前节点,则向左子树搜索;当前节点在p、q中间,则直接返回当前节点;

代码

public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {  
    if (root == null)  
        return root;  
  
    if (root.val > p.val && root.val > q.val) {  
        TreeNode leftTree = lowestCommonAncestor(root.left, p, q);  
        // 有结果直接返回,即这条边遍历结束,无需继续搜索  
        if (leftTree != null)  
            return leftTree; // return 终止当前递归函数  
    }  
  
    if (root.val < p.val && root.val < q.val) {  
        TreeNode rightTree = lowestCommonAncestor(root.right, p, q);  
        if (rightTree != null)  
            return rightTree;  
    }  
  
    // 为什么排除上门2种情况后的root一定是最近公共祖先?很重要  
    // 只剩下root val在p和q之间的情况  
    return root;  
}

No.2

题目

二叉搜索树中的插入操作

思路

  • BST,沿着一条路径递归

递归分析

  1. 返回值:节点,记录插入位置,参数:当前节点,和待插入的值
  2. 终止逻辑:终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回
  3. 单层递归逻辑:待插入值比当前值小,left指向递归返回;待插入值比当前值大,right指向递归返回;

代码

有返回值,用下一层递归返回值赋值给本层

public TreeNode insertIntoBST(TreeNode root, int val) {  
    if (root == null) {  
        return new TreeNode(val);  
    }  
  
    if (root.val < val)  
        root.right = insertIntoBST(root.right, val);  
    if (root.val > val)  
        root.left = insertIntoBST(root.left, val);  
  
    return root;  
}

无返回值

private TreeNode pre = null;  
  
private void insertHelper(TreeNode node, int val) {  
    if (node == null) {  
        TreeNode temp = new TreeNode(val);  
        if (pre.val < temp.val)  
            pre.right = temp;  
        if (pre.val > temp.val)  
            pre.left = temp;  
        return;  
    }  
  
    if (node.val < val) {  
        pre = node;  
        insertHelper(node.right, val);  
    }  
  
    if (node.val > val) {  
        pre = node;  
        insertHelper(node.left, val);  
    }  
}  
  
public TreeNode insertIntoBST(TreeNode root, int val) {  
    // 提前滤除直接给空树的情况  
    if (root == null)  
        return new TreeNode(val);  
  
    // 至少1个节点,递归开始后,pre一定不为null  
    insertHelper(root, val);  
    return root;  
}

No.3

题目

删除二叉搜索树中的节点

思路

  • 递归

递归分析

  1. 返回值:删除节点后的子树根,参数:节点,要删除的值
  2. 终止条件:遇到空节点,说明没找到要删除的节点
  3. 单层递归过程:五种情况
    1. 第一种情况:没找到删除的节点,遍历到空节点直接返回了
    2. 找到删除的节点,第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
    3. 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
    4. 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
    5. 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

代码


标签:TreeNode,递归,val,Leetcode,二叉树,return,Day22,root,节点
From: https://www.cnblogs.com/tomatoQt/p/17660266.html

相关文章

  • leetcode 题库994——bfs典型解法(队列+递归实现)
     classSolution:deforangesRotting(self,grid:list[list[int]])->int:m,n=len(grid),len(grid[0])queue,good=[],[]defbfs(queue,good,m,n,grid):times=0directions=[(-1,0),(1,0),(0,1),(0,-1)]......
  • 二叉树的链式存储结构 C++代码实现
    /*二叉树的链式存储结构*/#include<iostream>usingnamespacestd;/*二叉链表的定义*/typedefstructBiTNode{chardata;structBiTNode*lchild,*rchild;}BiTNode;typedefBiTNode*BiTree;//*************************************************......
  • 二叉树用顺序表实现 C++代码实现
    /*二叉树用顺序表实现*/#include<iostream>usingnamespacestd;/*完全二叉树顺序表的定义*/#defineMAX_BITREE_SIZE100typedefintSqBiTree[MAX_BITREE_SIZE];/*创建一个二叉树顺序表*/voidCreateBiTree(SqBiTree&T){inti;cout<<"输入元素个数:";......
  • LeetCode题库77.组合——dfs典型解法,递归+回溯+剪枝
     classSolution:defcombine(self,n:int,k:int):nums=[x+1forxinrange(n)]res,ans=[],[]defdfs(nums:list[int]):iflen(ans)==k:ans_copy=ans.copy()#复制,避免ans数组改变使res跟着改变......
  • leetcode_35. 搜索插入位置
    题目描述35.搜索插入位置给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法。输入:nums=[1,3,5,6],target=5输出:2输入:nums=[1,3,5,6],target......
  • LeetCode —— 排序
    148. 排序链表一般都用归并排序,因为是单向链表,其它排序算法根据下标找元素,向前遍历等都比较困难主函数流程是:如果head==null||head.next==nullreturnhead。因为 head.next==null即只有一个元素时,不用再划分了,而且一个元素本身也是有序的,所以返回就返回这一个元素......
  • 【LeetCode回溯算法#12】二叉树的直径,树形dp的前置内容(使用dfs)
    二叉树的直径给你一棵二叉树的根节点,返回该树的直径。二叉树的直径是指树中任意两个节点之间最长路径的长度。这条路径可能经过也可能不经过根节点root。两节点之间路径的长度由它们之间边数表示。示例1:输入:root=[1,2,3,4,5]输出:3解释:3,取路径[4,2,1,3]或......
  • 【LeetCode动态规划#17】知道秘密的人,维护多个dp数组
    知道秘密的人数在第1天,有一个人发现了一个秘密。给你一个整数delay,表示每个人会在发现秘密后的delay天之后,每天给一个新的人分享秘密。同时给你一个整数forget,表示每个人在发现秘密forget天之后会忘记这个秘密。一个人不能在忘记秘密那一天及之后的日子里分享......
  • 剑指 Offer 68 - II. 二叉树的最近公共祖先(简单)
    题目:classSolution{public:TreeNode*lowestCommonAncestor(TreeNode*root,TreeNode*p,TreeNode*q){if(root==p||root==q||root==nullptr)returnroot;//如果当前节点为空或者当前节点即为其中某个指定节点TreeNode*left=lowestCommo......
  • 剑指 Offer 55 - II. 平衡二叉树(简单)
    题目:classSolution{public:intgetHeight(TreeNode*cur){//递归函数返回的是以当前节点为根节点的高度。if(!cur)return0;//空节点的高度为0intleftHeight=getHeight(cur->left);//取得左节点的高度if(leftHeight=......