go 递归tree关系_golang链表理解、递归

1、不使用递归

a. 链表间运算(逐位相加)

leetcode题目 示例:

输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)

输出:7 -> 0 -> 8

原因:342 + 465 = 807

/**

* Definition for singly-linked list.

* type ListNode struct {

* Val int

* Next *ListNode

* }

*/

func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode {

//副本

node1 := l1

node2 := l2

//初始链表节点,指针才能与nil相比较

headNode := &ListNode{

Val: 0,

Next: nil,

}

nowNode := headNode

//溢出位

flag := 0

for (node1 != nil) || (node2 != nil) {

v1 := 0

if node1 != nil {

v1 = node1.Val

node1 = node1.Next

}

v2 := 0

if node2 != nil {

v2 = node2.Val

node2 = node2.Next

}

sv := v1 + v2 + flag

if sv < 10 {

flag = 0

}else{

sv = sv - 10

flag = 1

}

//1. 副本找到最新节点 的指针,逐个连接

if nowNode.Next != nil {

nowNode = nowNode.Next

}

//2. 新建插入节点 的指针

join := &ListNode{ Val: sv, Next: nil, }

//3. 替换空指针

nowNode.Next = join

}

//数据有溢出位

if flag == 1 {

join := &ListNode{ Val: 1, Next: nil, }

nowNode = nowNode.Next

nowNode.Next = join

}

return headNode.Next

}

小结&注意:

副本的拷贝:指针传递,避免遍历迭代时污染源数据;

锚点:核心,新节点添加到当前的next,如果next有了、下个next;

nowNode := headNode || if nowNode.Next != nil { nowNode = nowNode.Next }

b. 链表合并、排序

示例:

输入:

[

1->4->5,

1->3->4,

2->6

]

输出: 1->1->2->3->4->4->5->6

/**

* Definition for singly-linked list.

* type ListNode struct {

* Val int

* Next *ListNode

* }

*/

func mergeKLists(lists []*ListNode) *ListNode {

headNode := &ListNode{

Val: 0,

Next: nil,

}

nowNode := headNode

//合并,搜集排序值到slice

var s []int

for _,nodes := range(lists) {

for nodes != nil {

if nowNode.Next!=nil {

nowNode = nowNode.Next

}

nowNode.Next = &ListNode{

Val: nodes.Val,

Next: nil,

}

s = append(s, nodes.Val)

nodes = nodes.Next

}

}

comNode := headNode.Next

//排序

newHeadNode := &ListNode{

Val: 0,

Next: nil,

}

nowNode = newHeadNode

for i:=0; i

for j:=i+1; j

if s[i]>s[j] {

temp := s[i]

s[i] = s[j]

s[j] = temp

}

}

}

//重新组合

for i:=0; i

for {

if comNode.Val == s[i] {

nowNode.Next = &ListNode{

Val: comNode.Val,

Next: nil,

}

nowNode = nowNode.Next

break;

}

//指针回拨

if comNode.Next==nil {

comNode = headNode.Next

}else{

comNode = comNode.Next

}

}

}

return newHeadNode.Next

}

小结:

核心:副本和锚点。

2、正向递归、反向递归

a. 斐波那契数列

正向递归:

每项等于前2项之和 公式f[n]=f[n-1]+f[n-2]

func fibonacci(n int) int {

if n=1 {

return 0

} else if n= 2 {

return 1

} else {

return fibonacci(n-2) + fibonacci(n-1)

}

}

fibonacci(10)

b. 猴子吃桃

反向递归 问题:

有一堆桃子,猴子第一天吃了其中的一半,并在多吃了一个。以后猴子每天都吃其中的一半,然后再多吃一个,当到第10天时,发现只有一个桃子了。问题:最初共有多少个桃子?

func has_peach(n int) int {

if n=10 {

return 1

} else {

return (has_peach(n+1)+1) * 2

}

}

has_peach(1)

有疑问加站长微信联系(非本文作者)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MyBatis的递归查询实现树形结构的查询。具体步骤如下: 1. 定义实体类 定义一个实体类,表示树的节点,包含节点id、父节点id、节点名称等属性。 2. 定义Mapper接口 定义一个Mapper接口,包含一个方法,用于查询树形结构的节点。方法的返回值为List集合,表示查询到的树形结构的节点。 3. 编写Mapper.xml配置文件 在Mapper.xml配置文件中,编写递归查询语句,通过查询语句实现树形结构的查询。具体实现方式如下: - 定义一个select语句,用于查询指定节点的所有子节点。 - 在select语句中,使用union all关键字连接多个子查询语句,实现递归查询。 - 在子查询语句中,使用with recursive关键字定义递归查询语句。 4. 调用Mapper接口 在Java代码中,调用Mapper接口的方法,获取查询到的树形结构的节点。可以通过递归遍历节点,实现树形结构的展示。 下面是一个示例代码,供参考: ``` // 定义实体类 public class TreeNode { private Integer id; private Integer parentId; private String name; // getter和setter方法 } // 定义Mapper接口 public interface TreeNodeMapper { List<TreeNode> selectTreeNodes(Integer parentId); } // 编写Mapper.xml配置文件 <select id="selectTreeNodes" parameterType="java.lang.Integer" resultType="TreeNode"> with recursive cte(id, parent_id, name) as ( select id, parent_id, name from tree_node where parent_id = #{parentId} union all select tn.id, tn.parent_id, tn.name from tree_node tn inner join cte on tn.parent_id = cte.id ) select * from cte; </select> // 调用Mapper接口 @Autowired private TreeNodeMapper treeNodeMapper; public List<TreeNode> getTreeNodes(Integer parentId) { return treeNodeMapper.selectTreeNodes(parentId); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值