⭐️ 题目描述
🌟 链接1:leetcode 144.二叉树的前序遍历
🌟 链接2:leetcode 145.二叉树的后序遍历
🌟 链接3:leetcode 94.二叉树的中序遍历
思路:
leetcode的遍历和普通的遍历还略有一些不同,普通的遍历我们直接打印出结果,但是leetcode要让我们把遍历的结果存放在一个数组中,最后返回这个数组的结果。那么首先第一个问题是:这个数组我们要开辟多大的,当然可能会给提示如二叉树的节点个数不超过 xxx 个,那我们可以开辟一个很大的数组来存放结果(但是这种方式不推荐)。所以我们可以先计算出二叉树结点的个数在根据结点个数来动态的开辟数组(这种方式是比较优的)。 另一个问题是:既然我们要存到数组中,那必须要有当前存储位置的下标,但是由于二叉树递归是双路递归,会导致这个作用域中下标为
2
2
2(假如),当递归递下去下标已经被更新为
5
5
5,归回来的时候这个作用域中的下标还是
2
2
2,所以会有覆盖的问题。解决办法是我们传变量的地址,来根据地址改变下标。
1️⃣ 代码:
// 计算二叉树的节点个数
int BinaryTreeSize (struct TreeNode* root) {
if (root == NULL)
return 0;
return 1 + BinaryTreeSize(root->left) + BinaryTreeSize(root->right);
}
void preOrder (struct TreeNode* root , int * preOrderRes, int * curIndex) {
if (root == NULL) {
return;
}
preOrderRes[(*curIndex)++] = root->val;
preOrder(root->left , preOrderRes , curIndex);
preOrder(root->right , preOrderRes , curIndex);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize){
*returnSize = BinaryTreeSize(root);
int* preOrderRes = malloc(sizeof(int) * *returnSize);
int index = 0;
preOrder(root , preOrderRes , &index);
return preOrderRes;
}
后序遍历和中序遍历类似:只需要改变 preOrderRes[(*curIndex)++] = root->val;
、preOrder(root->left , preOrderRes , curIndex);
、preOrder(root->right , preOrderRes , curIndex);
这三行代码的顺序即可。💫 二叉树的其他接口实现和OJ题可以看往期的文章。