非递归一般都用到栈来实现
在面试百度LBS的时候被问到二叉树的非递归后序遍历,当时写得不是很好,出栈入栈的条件写得不是很清楚
现在附上代码,希望自己在面试的时候更加仔细严谨!
后序遍历采用了一个prevNode来记录前一个访问的点,当取栈顶的一个节点后,前一个访问的点如果是自己的右孩子的话,栈顶的点就可以输出了,并把自己的值赋给prevNode,否则自己的右孩子还没有被访问,先访问右孩子。
关键代码:
if (p->right==NULL||p->right==prevNode)
{
stk.pop();
cout<<p->val;
prevNode=p;
p=NULL;
}
else{
p=p->right;
}
下面是递归和非递归的全部代码:
已通过空树和一些普通树的测试
void preOrderRecursive(BTN* root){
if (root==NULL)
{
return;
}
cout<<root->val;
preOrderRecursive(root->left);
preOrderRecursive(root->right);
}
void inOrderRecursive(BTN* root){
if (NULL==root)
{
return;
}
inOrderRecursive(root->left);
cout<<root->val;
inOrderRecursive(root->right);
}
void preOrder(BTN* root){
if(!root){
return;
}
stack<BTN*> stk;
stk.push(root);
while (!stk.empty())
{
BTN *tmp=stk.top();
stk.pop();
cout<<tmp->val;
if(tmp->right)
stk.push(tmp->right);
if(tmp->left)
stk.push(tmp->left);
}
return;
}
void postOrderRecursive(BTN* root){
if (NULL==root)
{
return;
}
postOrderRecursive(root->left);
postOrderRecursive(root->right);
cout<<root->val;
}
void inOrder(BTN* root){
if(!root){
return;
}
stack<BTN*> stk;
BTN *p=root;
while(p||!stk.empty()){
while (p)
{
stk.push(p);
p=p->left;
}
p=stk.top();
stk.pop();
cout<<p->val;
p=p->right;
}
return;
}
void postOrder(BTN* root){
if(!root){
return;
}
stack<BTN*> stk;
BTN *p=root;
BTN *prevNode=NULL;
while(p||!stk.empty()){
while (p)
{
stk.push(p);
p=p->left;
}
p=stk.top();
if (p->right==NULL||p->right==prevNode)
{
stk.pop();
cout<<p->val;
prevNode=p;
p=NULL;
}
else{
p=p->right;
}
}
return;
}