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;
}