【leetcode】二叉树的层序遍历 144. 二叉树的前序遍历 94. 二叉树的中序遍历 145. 二叉树的后序遍历

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. 二叉树的中序遍历

94. 二叉树的中序遍历
在这里插入图片描述

3.二叉树的后序遍历

145. 二叉树的后序遍历
在这里插入图片描述

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");
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

念来过倒字名qwq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值