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?
解题思路:
虽然是medium但是是基础题了,毕竟是二叉树的遍历。
不用递归的办法就是使用堆栈。
根节点入栈
用指针不断沿着树的左孩子方向走,并且途经的孩子就入栈
直到左孩子为空。
这时候我们就可以从栈顶取出一个结点,退栈转右。
重复以上的过程直到栈为空。
如果是中序和前序的区别只在于访问节点在转右时访问还是在入栈时访问。
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack<TreeNode*> nodeStack;
vector<int> result;
TreeNode* p=root;
while(p!=NULL || !nodeStack.empty()){
if(p!=NULL){
nodeStack.push(p);
result.push_back(p->val);
p=p->left;
}else{
p=nodeStack.top();
nodeStack.pop();
p=p->right;
}
}
return result;
}
};
当然, 我发现这个答案的云运行速度比较慢。只打败了8%的人。。。
慢慢寻找原因啦