是否为完全二叉树搜索树

1.完全二叉搜索树:

①结点值唯一

①二叉树(正常左<根<右,本题设定:左>根>右)

①完全:

除最后一层外,其他层都满;

不满的最后一层往靠。

③第h层有2^(h-1)个结点,(除最后一层外)

④编号为i的结点的:(根结点编号为1)

左子节点为 2i

右子节点为 2i+1

父节点为  i/2(向下求整)

2.树的遍历方式:

①先序遍历

②中序遍历

③后序遍历

④层序遍历

3.重点:层序遍历、判断是否为完全二叉树都使用队列(数组形式)

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

typedef struct TreeNode {
    int data;
    struct TreeNode* left;
    struct TreeNode* right;
} TreeNode;
///创建结点
TreeNode* createNode(int data) {
    TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));
    newNode->data = data;
    newNode->left = NULL;
    newNode->right = NULL;
    return newNode;
}
///插入结点(定义为左子树键值大,右子树键值小)
TreeNode* insert(TreeNode* Node, int data) {
    if (!Node) return createNode(data);///空树
    if (data > Node->data) 
     Node->left = insert(Node->left, data);
    else
     Node->right = insert(Node->right, data);
    return Node;
}
void levelOrder(TreeNode*Node){
    if(Node==NULL)return ;
    TreeNode*queue[100];
    int front=0,rear=0;
    queue[rear++]=Node;
    bool first=true;
    while(front<rear){
        TreeNode*node=queue[front++];
        if(first){
            first=false;
        }
        else{
            printf(" ");
        }
        printf("%d",node->data);
        if(node->left)queue[rear++]=node->left;
        if(node->right)queue[rear++]=node->right;
    }
    printf("\n");
}
bool isCompleteTree(TreeNode*Node){
 if(Node==NULL)return true;
 TreeNode*queue[100]  ;
 int front=0,rear=0;
 queue[rear++]=Node;
 while(front<rear){
    TreeNode*node=queue[front++];
    if(node==NULL)return false;

    queue[rear++]=node->left;
    queue[rear++]=node->right;
 } 
 return true;
}
///是否为完全二叉树
int main() {
    int N;
    scanf("%d", &N);
    int nums[N];
    for (int i = 0; i < N; ++i) {
        scanf("%d", &nums[i]);
    }
///空树插入结点:(创建树)
    TreeNode* Node = NULL;
    for (int i = 0; i < N; ++i) {
        Node = insert(Node, nums[i]);
    }
///层序遍历
    levelOrder(Node);
///判断是否为完全二叉树
    if (isCompleteTree(Node)) {
        printf("YES\n");
    } else {
        printf("NO\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值