相关问题
144. Binary Tree Preorder Traversal
94. Binary Tree Inorder Traversal
145. Binary Tree Postorder Traversal
Discription
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].
思路
方法一
先让根进栈,只要栈不为空,就可以做弹出操作。
每次弹出一个结点,把它的左右结点都进栈,其中右子树先进栈,这样可以保证右子树在栈中总处于左子树的下面。
时间复杂度:
?
空间复杂度:
代码
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
vector<TreeNode*> sta;
if (root)
sta.push_back(root);
while (!sta.empty())
{
TreeNode *pNode = sta.back();
res.push_back(pNode->val);
sta.pop_back();
if (pNode->right) sta.push_back(pNode->right);
if (pNode->left) sta.push_back(pNode->left);
}
return res;
}
方法二
每次都向左走到头,然后再向右走,如图:
时间复杂度:
?
空间复杂度:
代码
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
vector<TreeNode*> sta;
if (root) sta.push_back(root);
while (!sta.empty())
{
while (sta.back())
{
//访问栈顶
res.push_back(sta.back()->val);
//向左走
sta.push_back(sta.back()->left);
}
// 弹出空指针
sta.pop_back();
//向右走
if (!sta.empty())
{
TreeNode *pNode = sta.back();
sta.pop_back();
sta.push_back(pNode->right);
}
}
return res;
}