当前位置:   article > 正文

leetcode144、145、94二叉树的前、中、后序遍历

leetcode144、145、94二叉树的前、中、后序遍历

本文主要讲解二叉树的前、中、后序遍历的要点与细节,按照步骤思考更方便理解 

c++代码如下,末尾

具体要点:
1. 首先我们要了解二叉树的前序,中序,后序的遍历顺序:
        前序: 左 右

        中序:左

        后序:左 右

怎么记呢?其实“ 前 中 后 ”指的是根节点的位置


2. 本题主要就是按照遍历顺序把元素都存入数组中,返回这个数组


3. 遇到二叉树的问题,特别是前中后序遍历时,其实核心是要使用深度优先算法

但若遇到层序遍历时,需要使用广度优先算法


4. 本题主要是深度优先算法,即递归

        我们下面用前序遍历举例说明:

        既然涉及递归,那么我们在写递归函数时,要确定以下内容:

  • 确定递归参数与返回值
  • 确定终止条件
  • 确定单层递归逻辑

首先,我们考虑一下递归参数,二叉树递归中,一般都是要传递当前节点进去,这道题还需要我们传递数组进去(如果一时间考虑不清楚参数有什么,可以边写边加)

其次,考虑返回值,由于我们是直接操作的数组,所以我们不需要返回值,即void

然后,考虑终止条件,对于二叉树,一般的终止条件是遇到节点是null,就结束

最后,考虑单层递归逻辑,我们目的是把节点按照所要求的遍历顺序加入数组中,所以,遇到根节点就加入,左右节点就执行递归。(只要根据前中后序顺序排列一下逻辑即可)


总结

二叉树的遍历通常要利用递归操作来实现,对于递归我们要考虑好递归的参数、终止条件、逻辑,不要一直往深了想,企图把递归走一遍。只要把单层递归的细节搞清楚就好。

前序c++

  1. class Solution {
  2. public:
  3. vector<int> preorderTraversal(TreeNode* root) {
  4. //定义返回值
  5. vector<int> res;
  6. traversal(root,res);
  7. return res;
  8. }
  9. //确定递归函数的参数与返回值,没有返回值,直接操作的res
  10. void traversal(TreeNode* cur, vector<int>& res) {
  11. //确定终止条件,当遇到null时候就不执行递归了
  12. if (cur == nullptr) return;
  13. //前序遍历:中左右
  14. //先将根节点加入结果中
  15. res.push_back(cur->val);
  16. //左
  17. traversal(cur->left, res);
  18. //右
  19. traversal(cur->right, res);
  20. }
  21. };

前序java

  1. class Solution{
  2. public List<Integer> preorderTraversal(TreeNode root){
  3. List<Integer> res = new ArrayList<Integer>();
  4. Traversal(root, res);
  5. return res;
  6. }
  7. public void Traversal(TreeNode root, List<Integer> res){
  8. if(root == null) return;
  9. res.add(root.val);
  10. Traversal(root.left, res);
  11. Traversal(root.right, res);
  12. }
  13. }

中序c++

  1. class Solution {
  2. public:
  3. vector<int> inorderTraversal(TreeNode* root) {
  4. vector<int> res;
  5. function(root, res);
  6. return res;
  7. }
  8. private:
  9. void function(TreeNode* root, vector<int>& res){
  10. if(!root){
  11. return;
  12. }
  13. function(root->left,res);
  14. res.push_back(root->val);
  15. function(root->right,res);
  16. }
  17. };

 中序java

  1. class Solution{
  2. public List<Integer> preorderTraversal(TreeNode root){
  3. List<Integer> res = new ArrayList<Integer>();
  4. Traversal(root, res);
  5. return res;
  6. }
  7. public void Traversal(TreeNode root, List<Integer> res){
  8. if(root == null) return;
  9. Traversal(root.left, res);
  10. res.add(root.val);
  11. Traversal(root.right, res);
  12. }
  13. }

后序c++

  1. class Solution {
  2. public:
  3. vector<int> postorderTraversal(TreeNode* root) {
  4. vector<int> res;
  5. traversal(root,res);
  6. return res;
  7. }
  8. void traversal(TreeNode* root,vector<int>& res){
  9. if (root == nullptr) return;
  10. traversal(root->left, res);
  11. traversal(root->right, res);
  12. res.push_back(root->val);
  13. }
  14. };

后序java

  1. class Solution {
  2. public List<Integer> postorderTraversal(TreeNode root) {
  3. List<Integer> res = new ArrayList<>();
  4. traverse(root, res);
  5. return res;
  6. }
  7. public void traverse(TreeNode root, List<Integer> res) {
  8. if(root == null) return;
  9. traverse(root.left, res);
  10. traverse(root.right, res);
  11. res.add(root.val);
  12. }
  13. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号