求给定的二叉树的前序遍历。
先序遍历(Pre-order)是按照根左右的顺序沿一定路径经过路径上所有的结点。在二叉树中,先根后左再右。巧记:根左右。
下图所示二叉树的遍历结果是:ABDECF
栈:后进先出(LIFO-last in first out):最后插入的元素最先出来。队列:先进先出(FIFO-first in first out):最先插入的元素最先出来。
解题思路:
1.非递归:(思路来源于牛客网此时一条咸鱼飘过)
利用栈这个数据结构,先把根放进栈里,然后当栈不为空的时候进行循环。一开始栈里只有根节点,由于是先序遍历遍历,因此栈顶放着要出栈的每一个根节点。所以先将栈顶元素出栈,然后按照右子树左子树的顺序让节点依次入栈。先右后左是因为栈是先进后出的数据结构,因为要先访问左子树,所以左子树后进栈先出栈。
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> tree;
stack<TreeNode *> s;
if (root == NULL){
return tree;
}
s.push(root);
while(!s.empty()){
TreeNode *topnode=s.top();
s.pop();
tree.push_back(topnode->val);
if(topnode->right!=NULL)
s.push(topnode->right);
if(topnode->left!=NULL)
s.push(topnode->left);
}
return tree;
}
};