赞
踩
Hello,友友们,小编将继续重新开始数据结构的学习,前面讲解了堆的部分知识,今天将讲解二叉树的链式结构的部分内容。
二叉树是一种数据结构,其中每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树的链式结构表示是使用指针(或引用)来连接节点,形成树形结构。每个节点包含一个数据元素和两个指向子节点的指针。
分为节点的定义,创建节点,创建树
下面我们将简单的手撕一个二叉树:
- typedef struct BTnode {
- int val;
- struct BTnode* left;
- struct BTnode* right;
- }Node;
-
- //节点创建
- Node* BuyNode(int x) {
- Node* node = (Node*)malloc(sizeof(Node));
- if (node == NULL) {
- perror("node fail");
- return NULL;
- }
- node->val = x;
- node->left = NULL;
- node->right = NULL;
- return node;
- }
- //树的创建
- Node* CreatTree() {
-
- Node* node1 = BuyNode(1);
- Node* node2 = BuyNode(2);
- Node* node3 = BuyNode(3);
- Node* node4 = BuyNode(4);
- Node* node5 = BuyNode(5);
- Node* node6 = BuyNode(6);
-
- node1->left = node2;
- node1->right = node4;
- node2->left = node3;
- node4->left = node5;
- node4->right = node6;
- return node1;
- }
- void PreOrder(Node* root) {
- if (root == NULL) {
- printf("N ");
- return;
- }
- printf("%d ", root->val);
- PreOrder(root->left);
- PreOrder(root->right);
-
- }
- void InOrder(Node* root) {
- if (root == NULL) {
- printf("N ");
- return;
- }
- InOrder(root->left);
- printf("%d ", root->val);
- InOrder(root->right);
-
- }
运行结果:N 3 N 2 N 1 N 5 N 4 N 6 N
- void PostOrder(Node* root) {
- if (root == NULL) {
- printf("N ");
- return;
- }
- PostOrder(root->left);
- PostOrder(root->right);
- printf("%d ", root->val);
-
- }
运行结果:N N 3 N 2 N N 5 N N 6 4 1
- // 队列结构
- typedef struct Queue {
- Node* data[MAX];
- int front;
- int rear;
- } Queue;
-
- // 初始化队列
- void initQueue(Queue* q) {
- q->front = 0;
- q->rear = 0;
- }
-
- // 入队
- void enqueue(Queue* q, Node* node) {
- if ((q->rear + 1) % MAX == q->front) {
- printf("Queue is full\n");
- return;
- }
- q->data[q->rear] = node;
- q->rear = (q->rear + 1) % MAX;
- }
-
- // 出队
- Node* dequeue(Queue* q) {
- if (q->front == q->rear) {
- printf("Queue is empty\n");
- return NULL;
- }
- Node* node = q->data[q->front];
- q->front = (q->front + 1) % MAX;
- return node;
- }
-
- // 判断队列是否为空
- int isEmpty(Queue* q) {
- return q->front == q->rear;
- }
从根节点开始,将每个节点的值打印出来,并依次将其左子节点和右子节点加入队列。
- // 层序遍历函数
- void levelOrder(Node* root) {
- if (root == NULL) {
- return;
- }
-
- Queue q;
- initQueue(&q);
- enqueue(&q, root);
-
- while (!isEmpty(&q)) {
- Node* node = dequeue(&q);
- printf("%d ", node->val);
-
- if (node->left) {
- enqueue(&q, node->left);
- }
- if (node->right) {
- enqueue(&q, node->right);
- }
- }
- }
- int main() {
- Node* root = CreatTree();
- PreOrder(root);
- printf("\n");
- InOrder(root);
- printf("\n");
- PostOrder(root);
- printf("\n");
- levelOrder(root);
- return 0;
- }
运行结果展示:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。