题目描述:
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
大意:前序遍历二叉树,二叉树的基本操作。
解题思路:1,首先将root入栈,循环过程中,读取栈顶元素,pop,然后分别将右子树,左子树分别入栈。循环直至栈空
2,边读取,边入栈的特点。
上代码:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
/*vector preorderTraversal(TreeNode *root) {
vector vec;
preorder(root,vec);
return vec;
}
void preorder(TreeNode* root,vector & vec)
{
//if(root==NULL)
//return;
if(root!=NULL)
{
vec.push_back(root->val);
preorder(root->left,vec);
preorder(root->right,vec);
}
}*/
vector preorderTraversal(TreeNode* root)
{
stack sta;
vector vec;
if(root==NULL)
return vec;
sta.push(root);
while(!sta.empty())
{
TreeNode* temp=sta.top();
vec.push_back(temp->val);
sta.pop();
if(temp->right!=NULL)
sta.push(temp->right);
if(temp->left!=NULL)
sta.push(temp->left);
}
return vec;
}
};
画图分析:
代码分析:1,递归算法中,比较明朗,但是注意调用的两参数函数,因为函数本身有返回值,所以递归的过程中要添加一个容器,且是引用,这样才能改变实参。
2,递归之前先将根节点入栈,循环条件为栈空。特点是边入栈(右子树,左子树),边读取(pop栈顶元素)