n皇后问题(分治 遍历) 2021.6.1

学习目标:

遍历与分治经典问题:n皇后问题

学习内容:

1:递归边界设置
2:n皇后问题的暴力破解
3:改进暴力法(回溯法)

学习时间:

2021.6.1 pm9:00

学习产出:

问题描述:n*n的棋盘上放置n个皇后,任意两个不在同一列,同一行,同一个对角线。
求合法的方案数
暴力法:

void generateP(int index) {
   
   
	if (index == n + 1) {
   
   //设置递归边界,生成一个排列
		bool flag = true;//用true来表示这是一个合法的方案
		for (int i = 0; i < n; i++) {
   
   //遍历任意两个皇后,复杂度O(n*n)
			for (int j = i + 1; j 
适用递归思想解决的二叉树问题有以下几种: - **求二叉树的深度**:对于求二叉树的深度问题,递归方法会先判断根节点是否为空,若为空则返回0;若不为空,则递归计算左子树和右子树的深度,最后返回左右子树深度的最大值加1。代码如下: ```python class BTNode: def __init__(self, value=None, left=None, right=None): self.value = value self.left = left self.right = right def BinaryTreeDepth(root): if root is None: return 0 leftdepth = BinaryTreeDepth(root.left) rightdepth = BinaryTreeDepth(root.right) return max(leftdepth, rightdepth) + 1 ``` 这种方法利用了递归的分治思想,将问题分解为计算左右子树深度的子问题 [^1]。 - **创建二叉树**:使用递归方法创建二叉树时,按前序遍历顺序输入字符序列,若遇到空字符(#),则表示该节点为空;否则,创建新节点并递归创建其左子树和右子树。代码如下: ```python class BNode: def __init__(self, data=None, lchild=None, rchild=None): self.data = data self.lchild = lchild self.rchild = rchild def CreateBTree(): ch = input().strip() if ch == '#': return None T = BNode() T.data = ch T.lchild = CreateBTree() T.rchild = CreateBTree() return T ``` 此方法通过递归不断深入树的结构,完成二叉树的构建 [^2]。 - **判断单值二叉树**:判断二叉树是否为单值二叉树,先查找根节点,若根节点不为空,比较根节点的左右孩子是否与根节点的值相同,若均相同,则完成第一层递归,之后再分别以左孩子和右孩子为根节点进行递归判断。代码如下: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def isUnivalTree(root): if root is None: return True if root.left and root.left.val != root.val: return False if root.right and root.right.val != root.val: return False return isUnivalTree(root.left) and isUnivalTree(root.right) ``` 该方法通过递归遍历树的每个节点,确保每个节点的值都相同 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值