判断二叉树是否是完全二叉树c语言_满二叉树和完全二叉树的区别

满二叉树与完全二叉树的区别:

满二叉树(Full Binary Tree):

一个二叉树

4abc5ba0c54eb75216ca552730026af7.png

完全二叉树(Complete Binary Tree):

完全二叉树:完全二叉树的节点数是任意的,从形式上讲它是个缺失的的三角形,但所缺失的部分一定是右下角某个连续的部
分,最后那一行可能不是完整的,对于k层的完全二叉树,节点数的范围2^ (k - 1) -1 < N< 2^k - 1;

设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,
这就是完全二叉树。

                                              0
                                     /               
                                  1                   2
                              /                  /       
                            3        4         5           6
                          /      /        /    
                        7    8  9     10  11

56b51edb2553c52a76f4f5f24cadba06.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会保密的。下面是判断二叉树是否为完全二叉树的 C 语言代码: ``` #include <stdio.h> #include <stdlib.h> #include <stdbool.h> // 定义二叉树结构体 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 检查二叉树是否为完全二叉树 bool isCompleteTree(TreeNode* root) { if (!root) { return true; } // 定义一个队列 struct Queue { TreeNode* node; int idx; }* q = NULL; int front = 0, rear = 0; // 先把根节点入队 q = (struct Queue*) malloc(sizeof(struct Queue)); q[rear++] = (struct Queue) {root, 1}; while (front < rear) { // 队首节点出队 struct Queue cur = q[front++]; TreeNode* node = cur.node; int idx = cur.idx; // 如果队首节点的编号不等于当前二叉树节点,说明不是完全二叉树 if (idx != front) { return false; } // 如果有左子节点,则把左子节点入队 if (node->left) { q = (struct Queue*) realloc(q, sizeof(struct Queue) * (rear + 1)); q[rear++] = (struct Queue) {node->left, idx * 2}; } // 如果有右子节点,则把右子节点入队 if (node->right) { q = (struct Queue*) realloc(q, sizeof(struct Queue) * (rear + 1)); q[rear++] = (struct Queue) {node->right, idx * 2 + 1}; } } // 遍历完整棵树后没有问题,说明是完全二叉树 return true; } // 测试 int main() { TreeNode* root = (TreeNode*) malloc(sizeof(TreeNode)); root->val = 1; root->left = (TreeNode*) malloc(sizeof(TreeNode)); root->left->val = 2; root->left->left = (TreeNode*) malloc(sizeof(TreeNode)); root->left->left->val = 4; root->left->right = (TreeNode*) malloc(sizeof(TreeNode)); root->left->right->val = 5; root->right = (TreeNode*) malloc(sizeof(TreeNode)); root->right->val = 3; root->right->left = (TreeNode*) malloc(sizeof(TreeNode)); root->right->left->val = 6; //root->right->right = (TreeNode*) malloc(sizeof(TreeNode)); //root->right->right->val = 7; bool res = isCompleteTree(root); printf("%d", res); return 0; } ``` 该算法使用队列进行广度优先搜索,遍历整个二叉树,同时用一个编号变量 `idx` 记录每个节点在二叉树中的位置编号。遍历完整棵树后如果没有问题,说明这是一棵完全二叉树
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值