二叉树+广度优先收索算法+回溯算法+递归讲解(一)

最近在搞01背包问题发现这几个东西之间存在着一些联系,所以就记录一下来理清这中间优点复杂的关系
原文参考链接可以看—1.彻底理解递归,从递归的本质说起!-----allenchenhh133----https://blog,csdn.net/allenchenhh133/article/details/80291252

==遍历二叉树是学习树这种数据结构首先要理解的一种基本操作,比较简单的就是用递归去遍历,如果递归调用“一次”,那么相对还比较好理解,比如求阶乘的递归算法:

int F(int n)
{
	if(n == 0)//递归边界
		return 1;
	return n*F(n-1);//递归公式
}

```一层一层调用知道递归结束条件再一层一层返回,但是如果二叉树是递归调用“两次”,似乎理解起来就不是很容易

void preorder(bintree t){
if(t){
printf("%c",t->data);
preorder(t->lchaild);
preorder(t->rchild);
}
}

 对于一颗如下的二叉树,它的前序遍历顺序该怎么样理解呢,
 可以把递归看成是自己调用另一个和自己功能一样,但是函数名不同的函数来理解。
==回溯法详解---参考链接--littlelufisher----回溯算法超通俗易懂详尽分析和例题----https://blog.csdn.net/sinat_27908213/article/details/80599460
 回溯法有通用解法的美称,实际上是一个类似枚举的深度优先收索参试过程,主要是在收索参试过程中寻找问题的解,当发现已不满足求解条件时就回溯返回也就是递归返回,参试别的路径。就是穷举法。
 要解决一个回溯问题通常要确定三个元素:
 1.选择:对于每一个特定的解,肯定是由一步步构建而来的,而每一步怎么构建,肯定都是有限个选择要怎么选择这个要知道在编程的时候就要定下优先或合法的每一步选择的顺序
 2条件。对于每一个特定的解的某一步,他必然要符和某个解的特定要求,如果不符合条件,就要回溯,
 3.结束。当到达一个特定结束条件的时候,就认为这个一步步构建的解是符合的解了
 对于回溯法来说每次递归调用很重要的一点就是把每次递归的不同信息传递给递归调用的函数,最重要的就是把上一步做过的某些事情的这个选择排除避免重复和无限递归。
 递归函数参数的选择需要遵循四个原则:
 1,必须有一个临时变量因为每一步选择后暂时还没有构成完整的解,这个时候这个选择的不完整的解,也要想办法传递给递归函数,也就是,把每次递归的不同情况传递给递归调用的函数
 2.最重要的是在参数设计中可以得到结束条件
 3.要保证递归函数返回时,状态可以恢复到递归前
 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值