题目描述: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].
Note: Recursive solution is trivial, could you do it iteratively?
Hide Tags Tree Stack
分析:
二叉树的先序遍历,访问节点顺序为 根-左-右,那么有递归实现和非递归实现;
递归法,此法属于暴力法:不多说,请直接阅读代码
非递归:先序:借助一个栈s,来存储节点。辅助接点cur来遍历整棵树。过程如下:首先cur指向根节点,循环处理cur,访问cur后将其压入栈中。此时若cur的左孩子不为空,那么cur指向它的左孩子;否则若栈s不为空,那么弹栈,直到弹出的节点的右孩子不为空为止,此时cur指向该右孩子;如果以上情况均不满足,说明已经遍历完,将cur指向NULL,循环结束。
另外:二叉树的深度优先遍历得到的序列也是先序遍历序列,此题同样可以用深度优先遍历来做。过程:也是借助一个栈s,先将根节点压入栈,然后循环处理栈:如果此时s不为空,那么出栈一个元素,访问它,然后处理其左右孩子:依次先将右孩子压入栈(若不为空),然后再把左孩子压入栈(若不为空)。继续循环,直到s为空。
以下是各种方法的C++实现:
/*//递归法//3ms//*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void preOrder(TreeNode* root,vector<int> &vec)
{
if(root != NULL)
{
vec.push_back(root->val);
preOrder( root->left, vec);
preOrder( root->right, vec);
}
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> vec;
if(root == NULL)
<span style="white-space:pre"> </span> return vec;
preOrder(root, vec);
return vec;
}
};
/*//先序遍历//3ms*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> vec;
if(root == NULL)
return vec;
TreeNode* cur = root;
stack<TreeNode *> s;
while(cur != NULL)
{
vec.push_back(cur->val); /**访问当前节点元素/
s.push(cur);
if(cur->left != NULL) /*若左孩子非空,则处理它*/
{
cur = cur->left;
}
else if(!s.empty())
{
while(!s.empty()) /*循环弹栈,直到弹栈节点的右孩子非空,处理该右孩子*/
{
cur = s.top();
s.pop();
cur = cur->right;
if(cur != NULL)
break;
}
}
else
cur = NULL;
}
return vec;
}
};
/*//深度优先遍历3ms/*/
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> vec;
if(root == NULL)
return vec;
TreeNode* cur = NULL;
stack<TreeNode *> s;
s.push(root);
while(!s.empty())
{
cur = s.top(); /*每次从栈里面取出一个节点,访问其元素*/
s.pop();
vec.push_back(cur->val);
if(cur->right != NULL) /*将当前节点的非空左孩子入栈*/
s.push(cur->right);
if(cur->left != NULL) /*将当前节点的非空右孩子入栈*/
s.push(cur->left);
}
return vec;
}
};