二叉树的非递归遍历

二叉树的非递归遍历

经过上网查找和深思熟虑,总结了比较容易理解的方法.参考:http://blog.csdn.net/algorithm_only/article/details/6976249


非递归先序

根结点先进栈,访问结点值,左孩子依次进栈,直到最左的孩子进栈。然后栈顶指针出栈,退至上一层,然后访问右子树,右子树访问完成之后,退至上一层,直至栈空,节点访问完成。先序遍历访问结点值是在结点进栈时。理解此算法最好找一棵简单的树跟着程序走一遍,在纸上画出栈的进栈、出栈情况。

[cpp]  view plain copy
  1. void printTreePreOrder2(BinaryNode *t) const   
  2.     {  
  3.         stack<BinaryNode*> stackNode;  
  4.         BinaryNode *pnode = t;  
  5.         while(pnode != NULL || !stackNode.empty())  
  6.         {  
  7.             while (pnode != NULL)  
  8.             {  
  9.                 cout << pnode->element << "  ";  
  10.                 stackNode.push(pnode);  
  11.                 pnode = pnode->left;  
  12.             }  
  13.             if(!stackNode.empty())  
  14.             {  
  15.                 pnode = stackNode.top();  
  16.                 stackNode.pop();  
  17.                 pnode = pnode->right;  
  18.             }  
  19.         }  
  20.     }  

非递归 中序

中序遍历和先序遍历类似,只是访问结点值是在出栈的时候,而先序遍历是在进栈的时候。

[cpp]  view plain copy
  1. void printTreeInorder2(BinaryNode *t) const  
  2.     {  
  3.         stack<BinaryNode*> stackNode;  
  4.         BinaryNode *pnode = t;  
  5.         while(pnode != NULL || !stackNode.empty())  
  6.         {  
  7.             while(pnode != NULL)  
  8.             {  
  9.                 stackNode.push(pnode);  
  10.                 pnode = pnode->left;  
  11.             }  
  12.             if(!stackNode.empty())  
  13.             {  
  14.                 pnode = stackNode.top();  
  15.                 cout << pnode->element << "  ";  
  16.                 stackNode.pop();  
  17.                 pnode= pnode->right;  
  18.             }  
  19.   
  20.         }  
  21.     }  

非递归后序

后序遍历

[cpp]  view plain copy
  1. void printTreePostOrder3(BinaryNode *t) const  
  2.     {  
  3.         BinaryNode *p = t;  
  4.         BinaryNode *temp = NULL;  
  5.         BinaryNode *pre = NULL;  
  6.         if (p == NULL)  
  7.         {  
  8.             cout << "empty " << endl;  
  9.         }  
  10.         stack<BinaryNode*> s;  
  11.   
  12.         while(p != NULL || !s.empty())  
  13.         {  
  14.             while (p != NULL)  
  15.             {  
  16.                 s.push(p);  
  17.                 p = p->left;  
  18.             }  
  19.   
  20.             if (!s.empty())  
  21.             {  
  22.                 temp = s.top();  
  23.                 if(temp->right == NULL || temp->right == pre) //若果没有 右子叶或者 右子叶已经访问过  
  24.                 {  
  25.                     cout << temp->element << "  ";  
  26.                     s.pop();  
  27.                     pre = temp;  
  28.                     p = NULL;  
  29.                 }  
  30.                 else  
  31.                 {  
  32.                     p = temp->right;  
  33.                 }  
  34.             }  
  35.         }  
  36.   
  37.     }  

和先序、中序类似,但要稍复杂一点,需要判断结点是否有右孩子和右孩子是否访问过。


上文来自:http://blog.csdn.net/liuhongxiangm/article/details/17391543

你可能感兴趣的:(C++,c,算法,递归,二叉树)