二叉树广度优先遍历利用队列 。
typedef char BTDataType;
typedef struct BinaryTreeNode
{
BTDataType data;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
typedef BTNode* QDataType;
// 链式结构:表示队列
typedef struct QueueNode
{
struct QueueNode* next;
QDataType data;
}QueueNode;
// 队列的结构 两个指针分别记录链表的头和尾
typedef struct Queue
{
QueueNode* head;
QueueNode* tail;
}Queue;
// 广度优先遍历 1.先把根入队列 2.出队头的数据,把他的下一层入进去
// 特点:借助队列的先进先出性质,上一层出的时候带入下一层 队列的代码参考前面的博客
void LevelOrder(BTNode* root)
{
Queue q;
QueueInit(&q);
if(root)
QueuePush(&q, root);
while(!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
printf("%d ",front->left);
if(front->left)
QueuePush(&q, front->left);
if(front->right)
QueuePush(&q, front->right);
}
QueueDestory(&q);
}
// 判断二叉树是否为完全二叉树 完全二叉树按层序走,节点是连续的,当出到NULL之后后面全是NULL就是完全二叉树,
// 如果后面有非空,那么就不是,说明节点层序走,非空节点不连续
bool BinaryTreeComplete(BTNode* root)
{
Queue q;
QueueInit(&q);
if(root)
QueuePush(&q, root);
while(!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
if(front == NULL)
{
break;
}
QueuePush(root->left);
QueuePush(root->right)l
}
while(!QueueEmpty(&q))
{
BTNode* front = QueueFront(&q);
QueuePop(&q);
if(front)
return false;
}
QueueDestory(&q);
return true;
}
// 创建节点
BTNode* CreateTreeNode (BTDataType x)
{
BTNode* n1 = (BTNode*)malloc(sizeof(BTNode));
n1->data = x;
n1->left = NULL;
n1->right = NULL:
return node;
}
int main()
{
// 手动连接上图中的树
BTNode* A = CreateTreeNode('A');
BTNode* B = CreateTreeNode('B');
BTNode* C = CreateTreeNode('C');
BTNode* D = CreateTreeNode('D');
BTNode* E = CreateTreeNode('E');
BTNode* F = CreateTreeNode('F');
A->left = B;
A->right = C;
B->left = D;
C->left = E;
c->right = F;
// 二级做法BinaryTreeDestory(&A);
// 一级做法
BinaryTreeDestory(A);
A = NULL;
}
题目
单值二叉树
二叉树的前序遍历:用C语言做题,需要创建数组,首先确定数组大小,遍历一遍得到个数,然后用子函数进行递归,不然用主函数递归每次都需要创建数组的操作。对于i需要传地址,因为当递归返回之后,不传地址的情况下,i会倒退到之前没有++的情况,导致给数组放值会混乱
相同的树:都同时走到空的 要返回真。如果有一个为空一个不为空则返回假。如果两个值不相同返回假。这三个条件都是终止条件。值如果相同不用管相当于是往下走的进行条件。