大家好,我是苏貝,本篇博客带大家刷题,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 1. 二叉树的前序遍历
- 2. 二叉树的中序遍历
- 3. 二叉树的后序遍历
1. 二叉树的前序遍历
点击查看题目
根据提示,我们应该先动态开辟一个数组,之后按前序遍历的顺序将二叉树的值插入数组中,最后再返回这个数组。我们再来看函数给定的形参是什么:root是指向二叉树的根节点的指针,*returnsize是数组的大小,而非题目给我们已经开辟好的数组。
首先我们要想开辟数组,那么我们需要知道数组的大小,也就是二叉树的节点总数,用下面这个函数来返回节点总数
int TreeSize(struct TreeNode* root)
{if(root==NULL)return 0;return 1+TreeSize(root->left)+TreeSize(root->right);// return root==NULL?0:// 1+TreeSize(root->left)+TreeSize(root->right);
}
然后,我们将二叉树的值按前序遍历的顺序放入数组中。那数组的下标如何控制呢?一般可以用全局变量,但是要注意在每次调用下面这个函数时,将i置为0。否则进行第二次调用该函数时,数组的下标是从n(二叉树个数)开始的,而不是从0开始
int i=0;void _preorderTraversal(struct TreeNode* root, int* arr)
{if(root==NULL)return;arr[i++]=root->val;_preorderTraversal(root->left,arr);_preorderTraversal(root->right,arr);
}
基于全局变量的不方便,我们也可以采用下面这种方法,即传一个初始化为0的变量的地址进来。
void _preorderTraversal(struct TreeNode* root, int* arr,int* pi)
{if(root==NULL)return;arr[(*pi)++]=root->val;_preorderTraversal(root->left,arr,pi);_preorderTraversal(root->right,arr,pi);
}
好的,我们来看最终代码
int TreeSize(struct TreeNode* root)
{if(root==NULL)return 0;return 1+TreeSize(root->left)+TreeSize(root->right);// return root==NULL?0:// 1+TreeSize(root->left)+TreeSize(root->right);
}void _preorderTraversal(struct TreeNode* root, int* arr,int* pi)
{if(root==NULL)return;arr[(*pi)++]=root->val;_preorderTraversal(root->left,arr,pi);_preorderTraversal(root->right,arr,pi);
}int* preorderTraversal(struct TreeNode* root, int* returnSize) {int n=TreeSize(root);*returnSize=n;int* arr=(int*)malloc(sizeof(int)*n);int i=0;_preorderTraversal(root,arr,&i);return arr;
}
2. 二叉树的中序遍历
点击查看题目
二叉树的中序遍历和下面的后序遍历思路同上,下面就只展示代码不做解释了
int TreeSize(struct TreeNode* root)
{return root==NULL?0:1+TreeSize(root->left)+TreeSize(root->right);
}void _inorderTraversal(struct TreeNode* root,int* arr,int* pi)
{if(root==NULL)return;_inorderTraversal(root->left,arr,pi);arr[(*pi)++]=root->val;_inorderTraversal(root->right,arr,pi);
}int* inorderTraversal(struct TreeNode* root, int* returnSize) {int n=TreeSize(root);*returnSize=n;int* arr=(int*)malloc(sizeof(int)*n);int i=0;_inorderTraversal(root,arr,&i);return arr;
}
3. 二叉树的后序遍历
点击查看题目
int TreeSize(struct TreeNode* root)
{return root==NULL?0:1+TreeSize(root->left)+TreeSize(root->right);
}void _postorderTraversal(struct TreeNode* root,int* arr,int* pi)
{if(root==NULL)return;_postorderTraversal(root->left,arr,pi);_postorderTraversal(root->right,arr,pi);arr[(*pi)++]=root->val;
}int* postorderTraversal(struct TreeNode* root, int* returnSize) {int n=TreeSize(root);*returnSize=n;int* arr=(int*)malloc(sizeof(int)*n);int i=0;_postorderTraversal(root,arr,&i);return arr;
}
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️