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].
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?
与上一道题及其想死,我只改了一句代码,不在详述,代码如下:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct stackElement {
TreeNode* pnode;//具体的节点
int color;//当前的遍历状态0:第一次遍历,1:第二次遍历,2:第三次遍历
stackElement(TreeNode *p,int c)
{
pnode=p;
color=c;
}
stackElement(const stackElement &ele)
{
pnode=ele.pnode;
color=ele.color;
}
stackElement operator=(const stackElement &ele)
{
stackElement element(ele);
return element;
}
};
class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
vector <int> postOrder;
if (root==NULL)
{
return postOrder;
}
stack <stackElement> preTraversalStack;
TreeNode* pcurrent=root;
preTraversalStack.push(stackElement(pcurrent,0));
while (!preTraversalStack.empty())
{
stackElement currElement=preTraversalStack.top();
preTraversalStack.pop();
//遍历左儿子
if (currElement.color==0)
{
//输出自己
postOrder.push_back(currElement.pnode->val);
currElement.color=1;//change color
preTraversalStack.push(currElement);
pcurrent=currElement.pnode->left;
if (pcurrent!=NULL)
{
preTraversalStack.push(stackElement(pcurrent,0));
}
}
else
{
//遍历右儿子
if (currElement.color==1)
{
currElement.color=2;//change color
preTraversalStack.push(currElement);
pcurrent=currElement.pnode->right;
if (pcurrent!=NULL)
{
preTraversalStack.push(stackElement(pcurrent,0));
}
}
else
{
continue;
}
}
}
return postOrder;
}
};