算法-判断是否为搜索二叉树

本文介绍了一种使用递归和三目运算符的方法来验证给定的二叉树是否为有效的二叉搜索树。该方法通过检查每个节点的左子树和右子树的数据是否符合二叉搜索树的定义来进行判断。

数据结构:

typedef struct node
{
    struct node *left;
    struct node *right;
    int data;
}node_type;

三目运算 + 递归:

boolean is_bst(struct node *root)
{
    return root==NULL?TRUE:(root->left==NULL?(root->left->data < root->data && is_bst(root->left) && is_bst(root->right)):(root->right==NULL?TRUE:(root->data < root->right->data && is_bst(root->right))));
}

what? 核心代码只有一行?! ——嗯!

(转发请注明出处)

在C语言中,判断一个给定的二叉树是否为完全二叉树可以使用层次遍历(广度优先搜索)的方式。完全二叉树是一种特殊的二叉树,除最后一层外,每一层都尽可能地填满,且最后一层的所有节点都集中在左边。 下面是一个简单的算法步骤: 1. 定义一个辅助函数`isFull`(用于检查当前层是否满了) 和 `isComplete`(主函数)。 2. 使用队列来存储节点,初始化根节点。 3. 当队列非空时,执行循环: a. 弹出队首节点并检查它的左右子节点是否为空,如果都为空,则当前层已满,调用`isFull()`。 b. 如果左子节点存在,添加到队列;如果右子节点不存在,说明不是完全二叉树,返回false。 c. 递归地处理下一层,直到队列为空。 4. 最后,如果所有层都满足完全二叉树条件,返回true。 以下是简单的C代码实现(假设结构体`Node`包含`value`和`left`、`right`指针): ```c #include <stdbool.h> #include <stdio.h> typedef struct Node { int value; struct Node* left; struct Node* right; } Node; bool isFull(Node* node, int level) { if (node == NULL) return true; // 空或最后一层都是全的 if (level % 2 == 0) { // 偶数层,检查左侧子节点 if (node->right != NULL) return false; } else { // 奇数层,检查右侧子节点 if (node->left != NULL) return false; } return isFull(node->left, level + 1) && isFull(node->right, level + 1); } bool isCompleteBinaryTree(Node* root) { bool isLevelFull = isFull(root, 1); // 初始层检查 queue_t q = initQueue(); // 初始化队列 enqueue(&q, root); while (!isEmpty(q)) { size_t size = dequeueSize(q); for (size_t i = 0; i < size; ++i) { Node* current = dequeue(&q); if (current->left != NULL || current->right != NULL) { if (!enqueue(&q, current->left)) return false; if (!enqueue(&q, current->right)) return false; } } if (!isLevelFull) // 检查下一个层是否全 isLevelFull = isFull(NULL, dequeueSize(q)); } return isLevelFull; } int main() { // 实现队列和相关操作... Node* tree = ...; // 初始化您的二叉树 if (isCompleteBinaryTree(tree)) printf("The tree is a complete binary tree.\n"); else printf("The tree is not a complete binary tree.\n"); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值