二叉树-求{0,1....n-1}的非空子集

本文介绍了一种利用二叉树结构求解集合{0,1...n-1}

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有同学问了下我怎么编程实现求集合{0,1….n-1}的非空子集合,我发现这恰好是一棵满二叉树的题,可以用二叉树求解。
代码如下:

#include <iostream>
using namespace std;
#include <stdlib.h>
int n ;
int flag[20];  
typedef struct binary_tree
{
    int data;
    struct binary_tree *lchild, *rchild;
}bin_node, *bin_tree;
void Create(int n, bin_tree &T, int flag)  //递归创建二叉树
{
    if(n == -1)  //n=-1时,二叉树深度到底  
    {
        return ;
    }
    T = (bin_tree)malloc(sizeof(bin_node));
    T->lchild = NULL;  //初始化
    T->rchild = NULL;   //初始化 
    if(flag == 0)   T->data = 0;  //左子树赋为0
    else    T->data = 1;        //右子树赋为1
    Create(n-1, T->lchild, 0); //递归创建左子树
    Create(n-1, T->rchild, 1); //递归创建右子树
}
void pre_view(bin_tree T, int rank)  //前序遍历
{ 
    if(T != NULL)
    {
        flag[rank] = T->data;  //将一个分支上的所有结点值记录下来
        if(rank == n+1)  //深度到底
        {
            int temp = 0;  //判断是否输出回车
            for(int i = n+1; i >= 1; i--)
            {
                if(flag[i] == 1)
                {
                    cout<<n-i+1<<" ";  //升序输出子集合
                    temp = 1;
                }
            }
            if(temp == 1)
            {
                cout<<endl;
            }   
        }   
    }
    if(T->lchild != NULL)
    {
        pre_view(T->lchild, rank+1);  //递归前序遍历
    } 
    if(T->rchild != NULL)
    {
        pre_view(T->rchild, rank+1);      //递归前序遍历
    }   
}
int main()
{
    int rank = 1;
    bin_tree T = NULL;
    cin>>n;
    n += 1;
    Create(n, T, 0);
    pre_view(T, rank);
    return 0;
}

忘了写free()了。。。。这是个不好的习惯。下次有空加上。
求非空子集合还可以用二进制或者递归这两种方法解决。但是我刚好学了二叉树,就当巩固了。

7-4 最优二叉搜索树 10 作者 任唯 单位 河北农业大学 设 S={x 1 ​ ,x 2 ​ ,...,x n ​ } 是有序集,且 x 1 ​ <x 2 ​ <...<x n ​ ,表示有序集S的二叉搜索树利用二叉树的结点来存储有序集中的元素。在该二叉搜索树中搜索一个元素x,结果有两种情形: 在二叉搜索树的内结点中找到 x=x i ​ (即找到了实结点),设这种情况的概率为 p i ​ 在二叉搜索树的叶节点中确定 x∈(x i ​ ,x i+1)(即找到了虚结点),设这种情况的概率为 q i ​ 设根节点的深度为0,存储元素 x i ​ 的结点深度为 c i ​ ,叶节点(x j ​ ,x j+1)的结点深度为 d j ​ ,在该二叉搜索树中进行一次搜索所需的平均比较次数为 m,那么有公式: m=∑ i=1 n ​ p i ​ (1+c i ​ )+∑ j=0 n ​ q j ​ d j ​ m又称为二叉搜索树 T 的平均路长,本题的要是对于有序集 S 及其存取概率(q 0 ​ ,p 1 ​ ,q 1 ​ ,..,p n ​ ,q n ​ ),在所有表示有序集 S 的二叉搜索树中找出一颗具有最小平均路长的二叉搜索树。 image-20210225215359687.png 输入格式: 第一行给出有序集中的元素数量 n (2<n<10) 第二行给出内结点(实结点)的存取概率布 p 1 ​ ,..,p n ​ 第三行给出叶节点(虚结点)的存取概率布 q 0 ​ ,q 1 ​ ,..,q n ​ 输出格式: 第一行输出最小 m ,保留两位小数。 第二行先序遍历输出二叉树,对于实结点输出其编号,对于虚结点输出.,每一个符号后有一个空格,若有多个满足要二叉树,则输出根节点编号最小的。 输入样例: 3 0.50 0.1 0.05 0.15 0.1 0.05 0.05 输出样例: 1.50 1 . 2 . 3 . . 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB7-4 最优二叉搜索树 10 作者 任唯 单位 河北农业大学 设 S={x 1 ​ ,x 2 ​ ,...,x n ​ } 是有序集,且 x 1 ​ <x 2 ​ <...<x n ​ ,表示有序集S的二叉搜索树利用二叉树的结点来存储有序集中的元素。在该二叉搜索树中搜索一个元素x,结果有两种情形: 在二叉搜索树的内结点中找到 x=x i ​ (即找到了实结点),设这种情况的概率为 p i ​ 在二叉搜索树的叶节点中确定 x∈(x i ​ ,x i+1)(即找到了虚结点),设这种情况的概率为 q i ​ 设根节点的深度为0,存储元素 x i ​ 的结点深度为 c i ​ ,叶节点(x j ​ ,x j+1)的结点深度为 d j ​ ,在该二叉搜索树中进行一次搜索所需的平均比较次数为 m,那么有公式: m=∑ i=1 n ​ p i ​ (1+c i ​ )+∑ j=0 n ​ q j ​ d j ​ m又称为二叉搜索树 T 的平均路长,本题的要是对于有序集 S 及其存取概率(q 0 ​ ,p 1 ​ ,q 1 ​ ,..,p n ​ ,q n ​ ),在所有表示有序集 S 的二叉搜索树中找出一颗具有最小平均路长的二叉搜索树。 image-20210225215359687.png 输入格式: 第一行给出有序集中的元素数量 n (2<n<10) 第二行给出内结点(实结点)的存取概率布 p 1 ​ ,..,p n ​ 第三行给出叶节点(虚结点)的存取概率布 q 0 ​ ,q 1 ​ ,..,q n ​ 输出格式: 第一行输出最小 m ,保留两位小数。 第二行先序遍历输出二叉树,对于实结点输出其编号,对于虚结点输出.,每一个符号后有一个空格,若有多个满足要二叉树,则输出根节点编号最小的。 输入样例: 3 0.50 0.1 0.05 0.15 0.1 0.05 0.05 输出样例: 1.50 1 . 2 . 3 . . 代码长度限制 16 KB 时间限制 400 ms 内存限制 64 MB 栈限制 8192 KB
最新发布
06-16
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值