当年在淘宝最后一面的时候被问过这个问题,当时思路混乱,答的不好。
#include<iostream>
#include<stack>
using namespace std;
struct Node
{
Node(char ch)
{
c = ch;
left = NULL;
right = NULL;
}
char c;
Node* left;
Node* right;
};
// 由于栈是先进后出,如果先把右子树压栈,再把左子树压栈,由于左子树在栈顶,访问完之后,又会去先压该左子树的右子树,以及该左子树的左子树,以此类推
#include<stack>
using namespace std;
struct Node
{
Node(char ch)
{
c = ch;
left = NULL;
right = NULL;
}
char c;
Node* left;
Node* right;
};
// 由于栈是先进后出,如果先把右子树压栈,再把左子树压栈,由于左子树在栈顶,访问完之后,又会去先压该左子树的右子树,以及该左子树的左子树,以此类推
// 这样就达到了一种用栈模拟递归的效果。
void preOrder(Node* root)
{
if(!root)
{
return;
}
stack<Node*> nodeStack;
nodeStack.push(root);
while(!nodeStack.empty())
{
Node* pNode = nodeStack.top();
cout << pNode->c;
nodeStack.pop();
if(pNode->right)
{
nodeStack.push(pNode->right);
}
if(pNode->left)
{
nodeStack.push(pNode->left);
}
}
}
int main(int argc, char** argv)
{
Node* pNodeA = new Node('A');
Node* pNodeB = new Node('B');
Node* pNodeC = new Node('C');
Node* pNodeD = new Node('D');
Node* pNodeE = new Node('E');
Node* pNodeF = new Node('F');
pNodeB->left = pNodeD;
pNodeC->left = pNodeE;
pNodeC->right = pNodeF;
pNodeA->left = pNodeB;
pNodeA->right = pNodeC;
preOrder(pNodeA);
}