00 写在前面
二叉树的遍历分为两种,递归和迭代。
递归是不好想但是实现简单的那种,迭代则是符合思考模式却不好实现的那种。
这次总结一下递归,迭代和统一迭代三种方法。
01 二叉树遍历
首先需要知道的是二叉树的遍历顺序,包括前序、中序和后序。这三种遍历的区别在于根节点的位置。
前序遍历是中左右,中序遍历是左中右,后续遍历是左右中。
另外还需要复习一下二叉树节点的结构:
struct TreeNode{
int val;
TreeNode *left;
TreeNode *right;
};
和链表差不多。
02 二叉树递归遍历
递归需要特别注意三个点:
- 函数的参数和返回值
- 递归终止的条件
- 每层的逻辑
前序遍历
先构造函数,输出遍历后的节点,不需要返回值
void PreOrder(TreeNode* cur,vector<int> &vec){
if(cur==NULL)return;
vec.push_back(cur->val);//中节点
PreOrder(cur->left,vec);//左孩子
PreOrder(cur->right,vec);//右孩子
}
首先把中节点存入,再递归遍历左孩子和右孩子。形成中左右的顺序。
这里不使用vector存也可以,直接输出。
中序遍历
中序遍历只需要修改一下遍历顺序即可。形成左中右的顺序。
void InOrder(TreeNode* cur,vector<int> &vec){
if(cur==NULL)return;
PreOrder(cur->left,vec);//左孩子
vec.push_back(cur->val);//中节点
PreOrder(cur->right,vec);//右孩子
}
后序遍历
后序遍历也只需要修改一下遍历顺序即可。形成左右中的顺序。
void PostOrder(TreeNode* cur,vector<int> &vec){
if(cur==NULL)return;
PreOr