数据结构的重要问题。
方法:二叉树的先序遍历形式有递归和非递归两种。
递归方式的实现:
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> v;
fun(root, v);
return v;
}
void fun(TreeNode *root, vector<int> &v)
{
if(root != NULL)
{
v.push_back(root->val);
fun(root->left, v);
fun(root->right, v);
}
}
};
递归和栈总是对应的。二叉树的非递归前序遍历思想是,先让根进栈,只要栈不为空,就可以做弹出操作。每次弹出一个结点,把它的左右结点都进栈,记得右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> v;
if(root == NULL)
return v;
stack<TreeNode*> s;
TreeNode *p;
s.push(root);
while(!s.empty())
{
p = s.top();
s.pop();
v.push_back(p->val);
if(p->right != NULL)
s.push(p->right);
if(p->left != NULL)
s.push(p->left);
}
return v;
}
};