问题描述:
Given a binary tree, return the preorder traversal of its nodes’ values.
For example:
Given binary tree {1,#,2,3},
1
\
2
/
3
return [1,2,3].
Note: Recursive solution is trivial, could you do it iteratively?
问题出自此处
解法思路:
1.递归:看见遍历不由自主想到了递归,先序遍历就是先遍历根节点,再遍历左右节点。一开始不懂#
是啥意思,以为val
用这个字符代表没有子树,然后转念一想不对啊,val
的数据类型是int
,不可能存得了这个,所以这个应该就是空指针的意思!
class Solution {
private:
vector<int> result;
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL) return result;
result.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
return result;
}
};
嘛,这个就是 O(N) 的时间复杂度啦。
2.循环。惊了!准备写博客的时候才发现题目要求用迭代?!害我终于以为自己可以用个迭代解决中等难度题时白白暗爽了一波!好吧,进入正题,在迭代中遍历,可以使用栈来帮助解决——不过要注意的是:先取数,再弹出该节点(以免重复算);然后先进栈右节点,再进栈左节点。(保证下次循环栈顶取出的是左节点)
class Solution {
private:
vector<int> result;
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL) return result;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()) {
TreeNode* cur = st.top();
result.push_back(cur->val);
st.pop();
if(cur->right) st.push(cur->right);
if(cur->left) st.push(cur->left);
}
return result;
}
};
这个时间复杂度也是
O(N)
~
+1s~