鉴于博主刷Leetcode以来的一路坎坷,故写下此血泪之路。博文的核心是教会大家如何用模板刷题。
作为 Leetcode 刷题指南-树 专题的第一章,本文主要介绍数据结构中,树的四种遍历方式前序遍历,中序遍历,后序遍历,层序遍历,以及相关的Leetcode题型。
前序遍历
144. 二叉树的前序遍历
给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
Method 1: 迭代
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack <TreeNode*> Sta;
if(!root)
return result;
Sta.push(root);
while(!Sta.empty())
{
TreeNode*tem=Sta.top();
result.push_back(tem->val);
Sta.pop();
if(tem->right) Sta.push(tem->right);//利用栈结构,right先进去,后出来
if(tem->left) Sta.push(tem->left);
}
return result;
}
};
解释:此方法为迭代法,前序遍历顺序为“node-node->left, node->right”,我们注意利用Sta栈的时候先push node->right,再push node->left。那么当我们取出来的时候,根据栈先进后出的原则,node->left先出,node->right后出。
时间复杂度:O(N);
空间复杂度:O(N);
Method 2: 递归
class Solution {
public:
void helper(TreeNode*node,vector<int>& result)
{
if(!node) return;
helper(node->left,result);
helper(node->right,result);
result.push_back(node->val);
}
vector<int> preorderTraversal(TreeNode* root) {
vector <int> result;
helper(root,result);
return result;
}
};
解释:此方法为递归法,注意的是helper函数里面,当出现“if(!node) return;” 后面就不需要判断”if(node->left)”或者“if(node->right)”。
时间复杂度:O(N);
空间复杂度:O(N);
中序遍历
94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
Method 1: 迭代
class Soluti