二叉树的遍历(深度遍历)

二叉树的遍历分为广度遍历和深度遍历。这里我们讲解一下深度遍历的代码如何书写。首先要明确深度遍历有三种遍历次序,分别是:前序遍历(中左右),中序遍历(左中右),后序遍历(左右中)。如何区别这几种遍历方式呢?关键在于单层递归时处理逻辑的位置,比如说先写处理逻辑,再写左递归和右递归,这就属于前序遍历。所谓处理逻辑,就是一些在父节点位置进行的操作。比如这道题的处理逻辑就是访问父节点的数值。又比如这道题:翻转二叉树(力扣226)-CSDN博客- ,这里的“中”就是调用swap函数交换父节点的左右孩子。另外,递归的代码我们遵循三部曲:一.确定函数参数(参数不一定要一开始全部确定好,可以用到了再加);二.确定终止条件;三.确定单层递归逻辑。还有就是二叉树的递归函数我们可以理解为递归左右孩子,也可以理解为递归以左右孩子为根节点的左右子树。不同题目场景,我们理解的角度不同。大家可以结合下面的代码以及注释理解。

代码如下:

前序遍历:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
   void traversal(TreeNode* cur,vector& res){
    //第二步:确定终止条件
    //深度遍历:直到遇到叶子节点之后的空节点才终止
        if(cur == NULL){
            return;
        }
        //第三步:确定单层递归逻辑
        res.push_back(cur -> val);//处理逻辑
        traversal(cur -> left,res);//左
        traversal(cur -> right,res);//右
}
    vector preorderTraversal(TreeNode* root) {
        vector res;
        //第一步:确定参数
         traversal(root,res);
         return res;
    }
};

中序遍历:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
void traversal(TreeNode* cur,vector& res){
        if(cur == NULL){
            return;
        }
        traversal(cur -> left,res);
         res.push_back(cur -> val);
        traversal(cur -> right,res);
    }
    vector inorderTraversal(TreeNode* root) {
        vector res;
        traversal(root,res);
        return res;
    }
};

后序遍历:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur,vector& res){
        if(cur == NULL){
            return;
        }
        traversal(cur -> left,res);
        traversal(cur -> right,res);
        res.push_back(cur -> val);
    }
    vector postorderTraversal(TreeNode* root) {
        vector res;
        traversal(root,res);
        return res;
    }
};

你可能感兴趣的:(算法,数据结构,leetcode)