赞
踩
树(Tree) 是一种重要的非线性数据结构,由n(n≥0)个节点组成,其中有一个根节点和若干子树,这些子树又是若干树的集合。
森林(Forest) 是m(m≥0)棵互不相交的树的集合。也就是说,森林是由多棵树组成的集合。
将一棵二叉树转化为森林的过程如下:
具体步骤如下:
树和森林的遍历方法主要包括深度优先遍历和广度优先遍历。
深度优先遍历(Depth First Traversal):包括先序遍历、中序遍历和后序遍历。
先序遍历(Preorder Traversal):
void preorderTraversal(TreeNode *root) {
if (root) {
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
中序遍历(Inorder Traversal):
void inorderTraversal(TreeNode *root) {
if (root) {
inorderTraversal(root->left);
printf("%d ", root->data);
inorderTraversal(root->right);
}
}
后序遍历(Postorder Traversal):
void postorderTraversal(TreeNode *root) {
if (root) {
postorderTraversal(root->left);
postorderTraversal(root->right);
printf("%d ", root->data);
}
}
广度优先遍历(Breadth First Traversal):层次遍历
#include <stdio.h> #include <stdlib.h> #define MAX_QUEUE_SIZE 100 typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; typedef struct { TreeNode *data[MAX_QUEUE_SIZE]; int front; int rear; } Queue; void initQueue(Queue *q) { q->front = q->rear = 0; } int isQueueEmpty(Queue *q) { return q->front == q->rear; } void enqueue(Queue *q, TreeNode *node) { if ((q->rear + 1) % MAX_QUEUE_SIZE == q->front) { printf("Queue is full\n"); return; } q->data[q->rear] = node; q->rear = (q->rear + 1) % MAX_QUEUE_SIZE; } TreeNode* dequeue(Queue *q) { if (isQueueEmpty(q)) { printf("Queue is empty\n"); return NULL; } TreeNode *node = q->data[q->front]; q->front = (q->front + 1) % MAX_QUEUE_SIZE; return node; } void levelOrderTraversal(TreeNode *root) { if (!root) return; Queue q; initQueue(&q); enqueue(&q, root); while (!isQueueEmpty(&q)) { TreeNode *node = dequeue(&q); printf("%d ", node->data); if (node->left) enqueue(&q, node->left); if (node->right) enqueue(&q, node->right); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。