题目:
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?
问题分析:
非递归实现二叉树的先序遍历 。
需要注意的问题是 :
如何判断当前结点的子树 的 两种 状态 (1、还未开始访问;2、已经访问结束了)
代码分析:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
#include<stack>
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector<int> ret;
if(root == NULL)
return ret;
stack<TreeNode*> data;
TreeNode* prev = NULL;
while(root||data.empty() == false)
{
while(root)
{
//判断当前的结点的子树是不是已经访问过了
if(prev&&root->right == prev)
break;
ret.push_back(root->val);
data.push(root);
root = root->left;
}
root = data.top();
while(root->right == NULL||root->right == prev)
{
prev = root;
data.pop();
if(data.empty() == true)
return ret;
root = data.top();
}
root = root->right;
}
return ret;
}
};
代码解析:
1、
TreeNode* prev = NULL;
使用prev表示的是 访问结束的结点(表示的是当前结点 的左右子树还有 它本身 都已被访问)