二叉树总结二

左神算法:找到二叉树中的最大搜索二叉子树(树形dp套路,Java版) 本题来自左神《程序员代码面试指南》“找到二叉树中的最大搜索二叉子树”题目。 题目 给定一棵二叉树的头节点 head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这棵子树的头节点。 例如,二叉树如图 3-17 所示。 这棵树中的最大搜索二叉子树如图 3-18 所示。 要求:如果节点数为 N,则要求时间复杂度为 O(N),额外空间复杂度为 O(h),其中,h 为二叉树的高度。 题解 本题涉及二叉树面试题中一个很常见的套路,也是全书的一个重要内容。利用分析可能性求解在二叉树上做类似动. 阅读详情

复习下写递归的重要方法: 

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

654.最大二叉树

力扣题目地址(opens new window)

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:

  • 二叉树的根是数组中的最大元素。
  • 左子树是通过数组中最大值左边部分构造出的最大二叉树。
  • 右子树是通过数组中最大值右边部分构造出的最大二叉树。

通过给定的数组构建最大二叉树,并且输出这个树的根节点。

方法是从数组中构建二叉树。

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func constructMaximumBinaryTree(nums []int) *TreeNode {
    if len(nums) < 1 {
        return nil
    }
    index:=findMax(nums)
    root := &TreeNode{
        Val:nums[index],
        Left:constructMaximumBinaryTree(nums[:index]),
        Right:constructMaximumBinaryTree(nums[index+1:]),
    }
    return root
}

func findMax(nums []int) (index int){
    for i:=0;i<len(nums);i++{
        if nums[i]>nums[index]{
            index=i
        }
    }
    return 
}

 

617.合并二叉树

力扣题目链接(opens new window)

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:

617.合并二叉树

注意: 合并必须从两个树的根节点开始。

 

那么我们来按照递归三部曲来解决:

  1. 确定递归函数的参数和返回值:

首先那么要合入两个二叉树,那么参数至少是要传入两个二叉树的根节点,返回值就是合并之后二叉树的根节点。

代码如下:

TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {
  1. 确定终止条件:

因为是传入了两个树,那么就有两个树遍历的节点t1 和 t2,如果t1 == NULL 了,两个树合并就应该是 t2 了啊(如果t2也为NULL也无所谓,合并之后就是NULL)。

反过来如果t2 == NULL,那么两个数合并就是t1(如果t1也为NULL也无所谓,合并之后就是NULL)。

代码如下:

if (t1 == NULL) return t2; // 如果t1为空,合并之后就应该是t2
if (t2 == NULL) return t1; // 如果t2为空,合并之后就应该是t1
  1. 确定单层递归的逻辑:

单层递归的逻辑就比较好些了,这里我们用重复利用一下t1这个树,t1就是合并之后树的根节点(就是修改了原来树的结构)。

那么单层递归中,就要把两棵树的元素加到一起。

t1->val += t2->val;

1

接下来t1 的左子树是:合并 t1左子树 t2左子树之后的左子树。

t1 的右子树:是 合并 t1右子树 t2右子树之后的右子树。

最终t1就是合并之后的根节点。

代码如下:

t1->left = mergeTrees(t1->left, t2->left);
t1->right = mergeTrees(t1->right, t2->right);
return t1;

得出一下代码:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func mergeTrees(root1 *TreeNode, root2 *TreeNode) *TreeNode {
    if root1 == nil{
        return root2
    }
    if root2 == nil{
        return root1
    }

    root1.Val+=root2.Val
    root1.Left = mergeTrees(root1.Left,root2.Left)
    root1.Right = mergeTrees(root1.Right,root2.Right)
    return root1
}

 

700.二叉搜索树中的搜索

力扣题目地址(opens new window)

给定二叉搜索树(BST)的根节点和一个值。 你需要在BST中找到节点值等于给定值的节点。 返回以该节点为根的子树。 如果节点不存在,则返回 NULL。

例如,

700.二叉搜索树中的搜索

在上述示例中,如果要找的值是 5,但因为没有节点值为 5,我们应该返回 NULL。

 递归三部曲:

递归法

  1. 确定递归函数的参数和返回值

递归函数的参数传入的就是根节点和要搜索的数值,返回的就是以这个搜索数值所在的节点。

代码如下:

TreeNode* searchBST(TreeNode* root, int val)
  1. 确定终止条件

如果root为空,或者找到这个数值了,就返回root节点。

if (root == NULL || root->val == val) return root;
  1. 确定单层递归的逻辑

看看二叉搜索树的单层递归逻辑有何不同。

因为二叉搜索树的节点是有序的,所以可以有方向的去搜索。

如果root->val > val,搜索左子树,如果root->val < val,就搜索右子树,最后如果都没有搜索到,就返回NULL。

 

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func searchBST(root *TreeNode, val int) *TreeNode {
    if root == nil {
        return nil
    }
    if root.Val == val {
        return root
    }
    if root.Val > val {
        return searchBST(root.Left, val)
    } else {
        return searchBST(root.Right,val)
    }
}

 

98.验证二叉搜索树

力扣题目链接(opens new window)

给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

98.验证二叉搜索树

#视频讲解

《代码随想录》算法视频公开课:你对二叉搜索树了解的还不够! | LeetCode:98.验证二叉搜索树 (opens new window),相信结合视频在看本篇题解,更有助于大家对本题的理解。

#思路

要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。

复习下二叉搜索树

二叉查找树(Binary Search Tree)二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。

二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func isValidBST(root *TreeNode) bool {
    if root == nil {
        return true
    }

    return helper(root,math.MinInt64,math.MaxInt64)
}

func helper(node *TreeNode, min,max int64) bool{
    if node == nil {
        return true
    }

    if min >= int64(node.Val) || max <= int64(node.Val) {
        return false
    }

    // 分别对左子树和右子树递归判断,如果左子树和右子树都符合则返回true
    return helper(node.Right,int64(node.Val),max) && helper(node.Left,min,int64(node.Val))
}

 

530.二叉搜索树的最小绝对差

力扣题目链接(opens new window)

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

示例:

530二叉搜索树的最小绝对差

提示:树中至少有 2 个节点。

 中序遍历,左,中,右,二叉搜索树。 左结点小于根结点,右结点大于根节点,可以得出有序数组。从小到大排序。然后求相邻的元素差即可

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func getMinimumDifference(root *TreeNode) int {
    var nums []int
    var inorder func(node *TreeNode)
    inorder = func(node *TreeNode){
        if node == nil {
            return
        }
        inorder(node.Left)
        nums=append(nums,node.Val)
        inorder(node.Right)
    }
    inorder(root)
    fmt.Println(nums)
    min:=nums[len(nums)-1]
    for i:=1;i<len(nums);i++{
        if nums[i]-nums[i-1] < min {
            min = nums[i]-nums[i-1]
        }
    }
    return min
}

 

501.二叉搜索树中的众数

力扣题目链接(opens new window)

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

  • 结点左子树中所含结点的值小于等于当前结点的值
  • 结点右子树中所含结点的值大于等于当前结点的值
  • 左子树和右子树都是二叉搜索树

例如:

给定 BST [1,null,2,2],

501. 二叉搜索树中的众数

返回[2].

提示:如果众数超过1个,不需考虑输出顺序

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

 简单方法:使用map统计

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func findMode(root *TreeNode) []int {
    var res = make(map[int]int,0)
    var inorder func(node *TreeNode)
    max:=0
    
    inorder = func(node *TreeNode){
        if node == nil {
            return
        }
        inorder(node.Left)
        res[node.Val]++
        inorder(node.Right)
    }
    inorder(root)
    index:=[]int{}
    fmt.Println(res)
    for _,v := range res {
        if v > max {
            max = v
        }
    }
    for k,v := range res {
        if v == max {
            index=append(index,k)
        }
    }
    return index
}

 不需要建立这么多额外空间的做法:

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func findMode(root *TreeNode) []int {
    res := make([]int,0)
    if root == nil {
        return res
    }
    max:=1
    count:=1
    var prev *TreeNode
    var traversal func(node *TreeNode)
    traversal = func(node *TreeNode){
        if node == nil {
            return
        }
        traversal(node.Left)
        //递归单层逻辑
        if prev != nil && prev.Val == node.Val {
            count += 1
        } else {
            count = 1
        }
        if count >= max {
            if count > max && len(res) > 0 {
                res = []int{node.Val}
            } else {
                res = append(res,node.Val)
            }
            max = count
        }
        prev = node
        traversal(node.Right)
    }
    traversal(root)
    return res
}

 

236. 二叉树的最近公共祖先

力扣题目链接(opens new window)

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

236. 二叉树的最近公共祖先

示例 1: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出: 3 解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例 2: 输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 输出: 5 解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉树中。

 

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
 func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {

     if root == nil {
         return root
     }

     //p 或者 q 本身就是公共祖先
     if root == p || root == q {
         return root
     }

     left := lowestCommonAncestor(root.Left, p , q)
     right := lowestCommonAncestor(root.Right, p , q)

    // Conquer
    // 左右两边都不为空,则根节点为祖先
     if left != nil && right != nil {
        return root
     }

     if left != nil {
         return left
     }

     if right != nil {
         return right
     }
     
     return nil
}

 

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

力扣题目链接(opens new window)

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

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

示例 1:

  • 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
  • 输出: 6
  • 解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

  • 输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
  • 输出: 2
  • 解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

 

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val   int
 *     Left  *TreeNode
 *     Right *TreeNode
 * }
 */

func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
	if root == nil {
        return root
    }

    if root.Val > p.Val && root.Val > q.Val {
        left:=lowestCommonAncestor(root.Left , p, q)
        if left != nil {
            return left
        }
    }

    if root.Val < p.Val && root.Val < q.Val {
        right:=lowestCommonAncestor(root.Right, p, q)
        if right != nil {
            return right
        }
    }
    
    return root
    
}

 

701.二叉搜索树中的插入操作

力扣题目链接(opens new window)

给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回任意有效的结果。

701.二叉搜索树中的插入操作

提示:

  • 给定的树上的节点数介于 0 和 10^4 之间
  • 每个节点都有一个唯一整数值,取值范围从 0 到 10^8
  • -10^8 <= val <= 10^8
  • 新值和原始二叉搜索树中的任意节点值都不同
func insertIntoBST(root *TreeNode, val int) *TreeNode {
    if root == nil {
        root = &TreeNode{Val: val}
        return root
    }
    if root.Val > val {
        root.Left = insertIntoBST(root.Left, val)
    } else {
        root.Right = insertIntoBST(root.Right, val)
    }
    return root
}

 

450.删除二叉搜索树中的节点

力扣题目链接(opens new window)

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 $O(h)$,h 为树的高度。

示例:

450.删除二叉搜索树中的节点

#思路

搜索树的节点删除要比节点增加复杂的多,有很多情况需要考虑,做好心里准备。

第一种情况是,如果要删除的节点没有子节点,我们只需要直接将父节点中,指向要删除节点的指针置为 null。

第二种情况是,如果要删除的节点只有一个子节点(只有左子节点或者右子节点),我们只需要更新父节点中,指向要删除节点的指针,让它指向要删除节点的子节点就可以了。

第三种情况是,如果要删除的节点有两个子节点,这就比较复杂了。我们需要找到这个节点的右子树中的最小节点,把它替换到要删除的节点上。然后再删除掉这个最小节点,因为最小节点肯定没有左子节点(如果有左子结点,那就不是最小节点了),所以,我们可以应用上面两条规则来删除这个最小节点。

 

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

 /*
    第一种情况是,如果要删除的节点没有子节点,我们只需要直接将父节点中,指向要删除节点的指针置为 null。
    第二种情况是,如果要删除的节点只有一个子节点(只有左子节点或者右子节点),我们只需要更新父节点中,指向要删除节点的指针,让它指向要删除节点的子节点就可以了。
    第三种情况是,如果要删除的节点有两个子节点,这就比较复杂了。我们需要找到这个节点的右子树中的最小节点,把它替换到要删除的节点上。然后再删除掉这个最小节点,因为最小节点肯定没有左子节点(如果有左子结点,那就不是最小节点了),所以,我们可以应用上面两条规则来删除这个最小节点。
 */
func deleteNode(root *TreeNode, key int) *TreeNode {
    p := root // p指向要删除的节点,初始化指向根节点
    var pp *TreeNode = nil // pp记录的是p的父节点

    for p != nil && p.Val != key {
        pp = p //这个时候p就是要删除的节点,pp就是要删除节点的父节点
        if key > p.Val {
            p=p.Right
        } else {
            p=p.Left
        }
    }

    if p == nil { // 没有找到
        return root
    }

    // 要删除的节点有两个子节点
    if p.Left != nil && p.Right != nil { // 查找右子树中最小节点

        var minP *TreeNode = nil
        var minPP *TreeNode = nil

        minP = p.Right
        minPP = p

        for minP.Left != nil {
            minPP = minP
            minP  = minP.Left
        }

        p.Val = minP.Val // 将minP的数据替换到p中

        p = minP 
        pp = minPP // 下面就变成了删除minP了
    }

    // 删除节点是叶子节点或者仅有一个子节点
    var child *TreeNode = nil

    if p.Left != nil {
        child = p.Left
    } else if p.Right != nil {
        child = p.Right
    } else {
        child = nil
    }
    
    if pp == nil {
        root = child
    } else if pp.Left == p {
        pp.Left = child
    } else {
        pp.Right = child
    }
    
    return root
}

 

 

 

 

《python神经网络编程》程序实现 《python神经网络编程》程序实现 通过对这本书的学习,结合这本书的内容: 完成了以下代码: 其中NN.py实现了一个类,这个类可以完成神经网络的初始化,训练以及输入数据并得出结果。 而run.py则是对神经网络类的使用 NN.py: import numpy import scipy.special #神经网络类的实现 class neuralNetwork: #构造函数初始化类 def __init__(self,inputnodes,hiddennodes,outputnodes 阅读详情

相关推荐

ros2的unity仿真配置(ros2-for-unity)

可以看到unity中输出了Hello World,验证完毕!可以看到unity上监听的/chatter。

m0_63671696的博客 4093

二叉树相关算法汇总(详细)

二叉树基本知识 二叉树(Binary Tree)是n(n≥0)个有限元素的集合,该集合或者为空,或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成。当集合为空时,称该二叉树为空二叉树。 二叉树常见概念: 结点的度。结点所拥有的子树的个数称为该结点的度。 叶子结点。度为0的结点称为叶子结点,或者称为终端结点。 分支结点。度不为0的结点称为分支结点,或者称为非终端结点。一棵树的结点除叶子结点外,其余的都是分支结点。 左孩子、右孩子、双亲。树中一个结点的子树的根结点称为这个结

泛泛之素 1万+

GIS应用技巧之三招搞定重叠区域数据提取

在很多分析过程中,常常需要分析判断哪些图形发生了重叠,该重叠情况的发生在对应分析环境下具有特定意义。例如在缓冲区分析中,若两个受灾点周边的受灾面积(即缓冲区)有所重叠,分析重叠区域的受灾影响时,就需要考虑相互影响的因素。本例中先用【要素转面】工具提取出发生重叠的区域,其次用【空间连接】工具将原始图层信息连接到重叠数据的图层,分析重叠数据的属性表,即可得到发生重叠的原始图层数据。 Step1 提取重叠区属数据。打开【数据管理工具】|【要素】|【要素转面】工具,输入要素设置为“circles”,输出要素类设置为

端木宛白的博客家园 6万+

【算法】二叉树常见算法

二叉树常见的算法题,单值二叉树、相同的树、对称二叉树、另一棵树的子树、判断完全二叉树共5种

weixin_52811588的博客 2614

ISCE2+MintPy环境搭建实战:用Anaconda五分钟搞定InSAR处理全家桶

本文提供了一份详细的ISCE2+MintPy环境安装教程,旨在帮助InSAR处理初学者快速搭建开发环境。通过使用Anaconda创建虚拟环境并配置国内镜像,用户可在五分钟内一键安装ISCE2和MintPy全家桶,有效解决依赖冲突和版本兼容性问题,让用户能专注于数据处理本身。

2y3u4i5o6p的博客 1004

Android音频学习(十四)——加载音频设备

loadHwModule 是 Android 音频系统的核心初始化函数,负责加载音频硬件抽象层(HAL)的模块实现。它建立 AudioPolicyService 与底层硬件的桥梁,将配置文件(audio_policy_config.xml)中的标签<module>定义转化为可操作的硬件对象,加载的是音频硬件模块(HAL实现),每个模块对应一种音频设备类型,以动态库的形式存在,负责与底层音频硬件交互。

miemie2014的博客 1732

经典算法:二叉树相关的算法集合

给出二叉树的相关算法,包括二叉树的递归创建,非递归遍历,二叉树的高度,层序遍历二叉树。

elliptical的专栏 2140

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

二叉树算法解题思路总结(一)

第一步:先考虑用递归的方式解决问题,注意递归的终止条件。有的递归需要用到回溯法和全局变量 第二步:如果递归无法解决问题,考虑迭代法,具体的迭代方式参考层序遍历和非递归遍历 本篇文章只介绍第一步相关的内容,题目来自leetcode和牛客网的剑指offer 一、找结点 1.二叉搜索树的最近公共祖先:leetcode236 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百...

meihuai7538的博客 2610

用 C# 快速构建一套可扩展的上位机框架(实战+源码思想)

本文介绍了一套基于C#的工业上位机开发框架设计方案。该框架通过模块化设计解决了上位机开发中的常见痛点,包括协议适配、通信管理、UI绑定等问题。核心架构采用分层设计,包含协议接口层、调度器层、通信抽象层和UI层,支持MVVM模式。框架提供了协议插件化扩展能力,通过JSON配置实现设备协议定义,同时封装了日志管理、异常处理等基础功能。该方案具有快速搭建、协议驱动、UI分离等特点,可显著提升上位机开发效率,适用于串口、TCP等多种通信场景,并能快速适配新设备协议。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 885

实干派!网易易盾增强版滑块验证码,全方位讲解识别思路(含源码)

该验证码是异形滑块验证码中的一种,缺口旋转+偏移的处理需要你有很好的图像处理知识,能很好的处理透明通道,同时,该验证码需要你能很好的处理缺口和背景之间匹配的关系,该验证码的处理难点就是两个缺口之间如何找到正确的,两个检测框都有很强的相似度,且加上背景图的干扰,在图像处理和有优化上难度大大增加。

码王吴彦祖的博客 2015

二叉树的基本算法

二叉树的先序遍历 就是每棵子树,都是先出现头结点、再左子树、再右子树。 递归序列!!! 一定会到达这个Node节点三次,也表明了有三个位置进行Node数据的处理,前中后 每个节点都是这样。 先序就是第一次到达某个节点就打印 中序就是第二次到达某个节点就打印 后序就是第三次到达某个节点再打印。 二叉树可以先去左边树上转一圈,再回到中间节点,再去右边树上转一圈,可以进行信息的整合。 f(Node) { if(Node==NULL) return; // 1 ...

weixin_38216573的博客 1464

高通开发系列 - Camera之摄像头调试记录

记录一些调试内容

fulinux的博客 1217

二叉树和度为二的有序树的区别

度为二的有序树和二叉树在定义、结构、特殊类型与性质以及应用场景等方面都存在明显的区别

buwangchuxinking的博客 1759

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

力扣hot100二刷——二叉树

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。

weixin_49426115的博客 1135

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树的遍历及遍历的知二求一

最后看CD,后序遍历中,它们的顺序为CD,所以后面的D是这棵子树的根结点。后序遍历左右完了再p,那对根结点,左完了就已经打印了左子树的所有元素,右完了就已经打印了右子树的所有元素。中序遍历先左再p(即打印自身)再右,那打印的元素中,根结点左边的一堆元素就是其左子树的元素吧,因为左子树遍历完了返回根结点才能做下一步的打印操作。学习了二叉树的前序遍历,中序遍历,后序遍历的基础知识,我们来简记一下思考流程:把深度搜索一棵二叉树的下一个层次(其子树,后代们)选择的孩子分别简记为。B的p,左,右也执行完了,返回E。

2401_88984100的博客 729

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

找到二叉树中的最大搜索二叉子树

找到二叉树中的最大搜索二叉子树 题目描述: 给定一颗二叉树,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,输出该子树总节点的数量。 搜索二叉树是指对于二叉树的任何一个节点,如果它有儿子,那么左儿子的值应该小于它的值,右儿子的值应该大于它的值。 输入描述: 第一行输入两个整数 n 和 root,n 表示二叉树的总节点个数,root 表示二叉树的根节点。 以下 n 行每行三个整数 fa,lch,rch,表示 fa 的左儿子为 lch,右儿子为 rch。(如果 lch 为 0 则表示 fa 没有左

MIC10086的博客 776

【算法】【二叉树模块】求二叉树中最大搜索二叉子树,返回头结点

最大搜索二叉子树

qq_39760347的博客 309

二叉树的定义、二叉树与度为二的树的区别、二叉树的特点、二叉树基本数据形态、二叉树抽象数据类型

本节主要介绍了二叉树的定义、二叉树与度为二的树的区别、二叉树的特点、二叉树基本数据形态、二叉树抽象数据类型。

weixin_65259109的博客 221

找到二叉树中的最大搜索二叉子树-Java版

题目 给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这棵子树的头节点。例如,下图中,右树就是左树的最大搜索子树。 解题思路—后序遍历:后序遍历二叉树,若当前结点的左右子树都符合搜索二叉树,就返回当前结点;若有左子树(右子树)不符合,则返回右子树根节点(左子树根节点)。需要设置全局变量来保存当前子树的最大值、最小值以及节点数。 代码不是特别好理...

疯狂的兔子 1404

《数据结构》实验二——二叉树的遍历

《数据结构》实验二报告 日期: 2020-11-23 程序名: shiyan2.c 实验内容: 二叉树的遍历 一、目的和要求(需求分析): 1、掌握二叉树的存储结构以及二叉树的建立和操作。 2、输入一串表达式后,建立二叉树,并对其进行先序、中序和后序的遍历。 (输入表达式如此形式:a+b*c-d-e/f….;以#号结束。) 3、递归实现表达式运算。 二、程序设计的基本思想,原理和算法描述: 程序的结构:首先定义二叉树,随后创建二叉树,此时利用flag判断记录表

123的博客 3117

二叉树问题---找到二叉树中的最大搜索二叉子树

题目: 给定一棵二叉树的头节点head,已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉树,并返回这棵子树的头节点。(注意子树的概念)def biggestSubBST(root): def findBiggestSubBST(root, record): if not root: record[0] = 0 reco

冰殇的博客 894

二叉树-找到二叉树中的最大搜索二叉子树

//找到二叉树中的最大搜索二叉子树 public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } public Node biggestSubBST(Node hea...

六月二十七的博客 485

数据结构 找到二叉树中的最大搜索二叉子树

程序员代码面试指南(左程云)读书笔记 第三章     找到二叉树中的最大搜索二叉子树 题目:给定一棵二叉树的头节点head, 已知其中所有节点的值都不一样,找到含有节点最多的搜索二叉子树,并返回这颗子树的头节点。  例如:如图二叉树           这颗二叉树的最大搜索二叉子树如图所示 要求:          如果节点数为N,

OY_palada 2334

20 - 二叉树(二)

1. 按之字形顺序打印二叉树 2. 二叉树中和为某一值的路径 3. 二叉搜索树与双向链表

qq_41721746的博客 260
上一篇: 二叉树总结一
evilwave
博客等级 码龄19年 5粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值