判断一颗二叉树是否是另一颗树的子树

该博客介绍了一道面试题,即如何判断一棵二叉树B是否是另一棵二叉树A的子树。内容包括二叉树节点的定义、解决思路以及代码实现,思路分为两步:首先在A中找到与B根节点值相同的节点R,然后检查A中以R为根的子树是否与B结构相同。

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

  • 题目:输入两棵二叉树A和B判断B是不是A的子树,二叉树节点定义如下
struct BinaryTree
{
    BinaryTree(char data)
    :_pLeft(NULL)
    , _pRight(NULL)
    , _data(data)
    {}
    BinaryTree *_pLeft;
    BinaryTree *_pRight;
    char _data;
};

附上创建树的代码,方便测试

void CreateBinaryTree(BinaryTree *&pRoot, char *str,size_t size, size_t &index)
{
    if (index < size && str[index] != 
在C语言中,判断一棵二叉树是否是完全二叉树,可以采用深度优先搜索(DFS)的方式逐层检查。一个二叉树是完全二叉树,如果每个层级都是满的,除了最后一层外,其余各层都尽可能地填满,且最后一层的所有节点都在最左边。 下面是一个简单的算法步骤: 1. 定义一个函数`isCompleteTree(root)`,该函数接收二叉树的根节点作为输入。 2. 对于每一层,计算当前层的实际节点数和最大节点数(如果是满的,应该是2^(layer+1)-1),两者相等则说明到这一层为止是完全二叉树。 3. 如果到达了最后一层,遍历剩余的节点,如果它们不是左孩子,那么这棵就不是完全二叉树。 4. 递归地对左右子树进行同样的检查。 伪代码如下: ```c int isCompleteTree(Node* root) { if (root == NULL) return 1; // 空视为完全二叉树 int layer = 0; int maxNodesInLayer = 1 << (layer + 1); // 计算当前层的最大节点数 Node* current = root; while (current != NULL) { ++layer; // 检查当前层是否有空位 if (current->left != NULL && current->right != NULL) { maxNodesInLayer <<= 1; } // 如果当前层的节点数小于最大节点数,不是完全二叉树 if (current->numChildren < maxNodesInLayer) break; current = current->left ? current->right : NULL; } // 检查剩余的节点是否全在左边 if (current != NULL) return 0; return isCompleteTree(root->left) && isCompleteTree(root->right); } ``` 其中,`Node`结构包含指向左右孩子的指针和一个表示子节点数量的变量`numChildren`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值