LeetCode144-二叉树的前序遍历
最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩!
1、题目
给定一个二叉树,返回它的前序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2、思路
基于栈的遍历:
过程:将整棵树的最左边的一条链压入栈中,每次取出栈顶元素,如果它有右子树,则将右子树压入栈中。
基于递归实现:
void fun(tree){
tree->val;
fun(tree->left);
fun(tree->right);
}
3、代码
递归实现:
class Solution {
public:
vector<int> res;
vector<int> preorderTraversal(TreeNode* root) {
if(root==NULL) return res;
res.push_back(root->val);
if(root->left) preorderTraversal(root->left);
if(root->right) preorderTraversal(root->right);
return res;
}
};
基于栈的遍历:
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(n)。
c++
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode* > stk;
auto p=root;
while(p||stk.size())
{
while(p)
{
stk.push(p);
res.push_back(p->val);
p=p->left;
}
p=stk.top();
stk.pop();
p=p->right;
}
return res;
}
};
Java
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<> ();
LinkedList<Integer> res=new LinkedList<> ();
if(root==null) return res;
stack.add(root);
while(!stack.isEmpty()) {
TreeNode node=stack.pollLast();
res.add(node.val);
if(node.right!=null) {
stack.add(node.right);
}
if(node.left!=null) {
stack.add(node.left);
}
}
return res;
}
}