题目描述
求给定的二叉树的前序遍历。 例如: 给定的二叉树为{1,#,2,3},
返回:[1,2,3]. 备注;用递归来解这道题很简单,你可以给出迭代的解法么?
思路分析:
先序遍历:根左右
1.无论是哪种遍历方式,用迭代实现都是用栈去做的,所以我们对栈的先入后出的顺序要很清楚。
2.对于先序遍历每次都是要先遍历根节点,然后将遍历左子树,最后是右子树,但是由于栈是先入后出的,所以我们压栈的时候就要注意了,每次应该先压右子树,再压左子树!这是这道题的核心关键
3.所以到这里我们的想法就基本出来了,先将根节点压栈,然后出栈,之后轮流将右孩子和左孩子压栈,然后遍历左孩子,出栈,之后压左孩子的右,左孩子,就这么一直下去就可以得到先序遍历。
牛客代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型vector
*/
vector<int> preorderTraversal(TreeNode* root) {
// write code here
vector<int> preorder;
if(root==nullptr)
return preorder;
else{
stack<TreeNode*> preorderStack;
preorderStack.push(root);
while(!preorderStack.empty())
{
TreeNode* temp=preorderStack.top();
preorder.push_back(temp->val);
preorderStack.pop();
//栈先进后出,右子树先进后出输出才是先序遍历
if(temp->right!=nullptr)
preorderStack.push(temp->right);
if(temp->left!=nullptr)
preorderStack.push(temp->left);
}
return preorder;
}
}
};