赞
踩
二叉树的遍历是指按照一定的顺序访问二叉树中所有节点。常见的遍历方法有前序遍历(Preorder Traversal)、中序遍历(Inorder Traversal)、后序遍历(Postorder Traversal)和层次遍历(Level Order 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);
}
}
层次遍历(Level Order 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); } }
线索二叉树是一种特殊的二叉树,通过对空指针加以利用,使得二叉树的遍历更加高效。在线索二叉树中,每个节点的空指针指向在某种遍历方式下的前驱或后继节点。
线索的定义:
线索二叉树的类型:
线索二叉树的结构定义:
typedef struct ThreadedTreeNode {
int data;
struct ThreadedTreeNode *left;
struct ThreadedTreeNode *right;
int ltag; // 0: left指向左孩子, 1: left指向前驱
int rtag; // 0: right指向右孩子, 1: right指向后继
} ThreadedTreeNode;
中序线索二叉树的建立:
void createInorderThread(ThreadedTreeNode *root, ThreadedTreeNode **pre) { if (root) { createInorderThread(root->left, pre); if (!root->left) { root->left = *pre; root->ltag = 1; } if (*pre && !(*pre)->right) { (*pre)->right = root; (*pre)->rtag = 1; } *pre = root; createInorderThread(root->right, pre); } } void createInorderThreadTree(ThreadedTreeNode *root) { ThreadedTreeNode *pre = NULL; if (root) { createInorderThread(root, &pre); if (pre->right == NULL) { pre->rtag = 1; } } }
中序线索二叉树的遍历:
void inorderThreadedTraversal(ThreadedTreeNode *root) {
ThreadedTreeNode *p = root;
while (p) {
while (p->ltag == 0) {
p = p->left;
}
printf("%d ", p->data);
while (p->rtag == 1 && p->right != NULL) {
p = p->right;
printf("%d ", p->data);
}
p = p->right;
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。