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;
}
}