所有可能的满二叉树(感悟递归)

18 篇文章 0 订阅
10 篇文章 0 订阅

题目:满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。
返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。
答案中每个树的每个结点都必须有 node.val=0。
你可以按任何顺序返回树的最终列表。

示例:
输入:7
输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]在这里插入图片描述
提示: 1 <= N <= 20

来源:力扣(LeetCode)。

思路:其实本体看起来复杂,但是经过我们的聪明的大脑仔细分析之后,便可将问题简单化;
首先分析问题可知,N一定是1,3,5等数字,所以先排除所有偶数。
而后,我们假设F(N)是含有N个节点的所有可能的满二叉树集合,那么F(N)实际便等于F(X)(X从1到N-2,左子树)和F(N-X-1)(右子树)的集合,那么问题便迎刃而解。

class Solution {
    public List<TreeNode> helper(List<TreeNode> list,int n){
		if(n==1) {//截至条件
			TreeNode t = new TreeNode(0);
			t.left = null;
			t.right = null;
			list.add(t);
			return list;
		}
		for(int i = 1;i<n;i=i+2) {//左右子树的递归
			List<TreeNode> p1 = new ArrayList<TreeNode>();
			List<TreeNode> p2 = new ArrayList<TreeNode>();
			int j = n-i-1;
			p1 = helper(p1,i);
			p2 = helper(p2,j);
			for(TreeNode t1:p1) {//左右子树的整合
				for(TreeNode t2:p2) {
					TreeNode temp = new TreeNode(0);
					temp.left = t1;
					temp.right = t2;
					list.add(temp);
				}
			}
		}
		return list;
	}
	public List<TreeNode> allPossibleFBT(int N) {
        if(N%2 == 0) {//判断
        	return new ArrayList<TreeNode>();
        }
        List<TreeNode> list = new ArrayList<TreeNode>();
        if(N==1) {
        	TreeNode t = new TreeNode(0);
        	t.left = null;
        	t.right = null;
        	list.add(t);
        	return list;
        }
        helper(list,N);
        return list;
    }	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值