二叉树的遍历分为广度遍历和深度遍历。这里我们讲解一下深度遍历的代码如何书写。首先要明确深度遍历有三种遍历次序,分别是:前序遍历(中左右),中序遍历(左中右),后序遍历(左右中)。如何区别这几种遍历方式呢?关键在于单层递归时处理逻辑的位置,比如说先写处理逻辑,再写左递归和右递归,这就属于前序遍历。所谓处理逻辑,就是一些在父节点位置进行的操作。比如这道题的处理逻辑就是访问父节点的数值。又比如这道题:翻转二叉树(力扣226)-CSDN博客- ,这里的“中”就是调用swap函数交换父节点的左3右孩子。另外,递归的代码我们遵循三部曲:一.确定函数参数(参数不一定要一开始全部确定好,可以用到了再加);二.确定终止条件;三.确定单层递归逻辑。代码如下:
/**
* 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<int>& res){
//第二步:确定终止条件
//深度遍历:直到遇到叶子节点之后的空节点才终止
if(cur == NULL){
return;
}
//第三步:确定单层递归逻辑
res.push_back(cur -> val);//处理逻辑
traversal(cur -> left,res);//左
traversal(cur -> right,res);//右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> 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<int>& res){
if(cur == NULL){
return;
}
traversal(cur -> left,res);
res.push_back(cur -> val);
traversal(cur -> right,res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> 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<int>& res){
if(cur == NULL){
return;
}
traversal(cur -> left,res);
traversal(cur -> right,res);
res.push_back(cur -> val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root,res);
return res;
}
};
标签:遍历,TreeNode,cur,val,res,right,二叉树,深度,left
From: https://blog.csdn.net/yaodec/article/details/145289415