1.二叉树的前序遍历(深度优先DFS)
二叉树最标准的深度优先遍历(Depth-Frist Search),中序和后序是不标准的深度优先遍历,与前序的区别是访问时机有差异。
144. 二叉树的前序遍历
size_t TreeSize(struct TreeNode* root) {
return root == NULL
? 0 : 1 + TreeSize(root->left) + TreeSize(root->right);
}
void Preorder(struct TreeNode* root, int* a, int* pi) {
if (root != NULL) {
a[(*pi)++] = root->val;
Preorder(root->left, a, pi);
Preorder(root->right, a, pi);
}
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
*returnSize = TreeSize(root);
int* a = (int*)malloc(sizeof(int) * (*returnSize));
int i = 0;
Preorder(root, a, &i);
return a;
}
2. 二叉树的中序遍历
3.二叉树的后序遍历
4.二叉树的层序遍历(广度优先BFS)
需要借助队列(queue),二叉树的层序遍历即广度优先遍历(Breadth-Frist Search)。
void LevelOrder(TreeNode* root) {
if (root != NULL) {
Queue queue;
Init(&queue);
Push(&queue, root);
while (!Empty(&queue)) {
TreeNode* treeNode = Front(&queue);
printf("%d ", treeNode->val);
Pop(&queue);
if (treeNode->left != NULL) {
Push(&queue, treeNode->left);
}
if (treeNode->right != NULL) {
Push(&queue, treeNode->right);
}
}
}
else {
printf("NULL\n");
}
}
每一层打印完后换行:
void LevelOrder(TreeNode* root) {
if (root != NULL) {
Queue queue;
Init(&queue);
Push(&queue, root);
while (!Empty(&queue)) {
int levelSize = Size(&queue);
while (levelSize--) { // 一层节点个数
TreeNode* treeNode = Front(&queue);
printf("%d ", treeNode->val);
Pop(&queue);
if (treeNode->left != NULL) {
Push(&queue, treeNode->left);
}
if (treeNode->right != NULL) {
Push(&queue, treeNode->right);
}
}
printf("\n");
}
}
else {
printf("NULL\n");
}
}