Chinaunix首页 | 论坛 | 博客
  • 博客访问: 21933
  • 博文数量: 6
  • 博客积分: 190
  • 博客等级: 入伍新兵
  • 技术积分: 51
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-02 10:34
文章分类

全部博文(6)

文章存档

2012年(2)

2011年(4)

我的朋友

分类: C/C++

2011-09-02 23:02:53

某天突然心血来潮,发现后序遍历二叉树非递归算法不会了,网上四处寻找,还是保存一下吧

以下内容转自网络,因找不到出处。。。故没有原创链接

二叉树是很有用的一种数据结构,遍历则是其基本操作,这里列出实是保证完整性。二叉树后序遍历的非递归遍历中当当前节点存在右子树的时候需要先遍历右子树,因此要对二叉树的节点定义中添加_tag域,标志当前节点右子树是否已经遍历,备用的结构定义和函数:
//二叉树节点定义
class TreeNodeElement
{
       public:
              TreeNodeElement();
 
              TreeNodeElement(int value);
             
              TreeNodeElement(int value,TreeNodeElement* l,TreeNodeElement* r);
 
              ~TreeNodeElement();
 
       private:
       public:
              int _value;
 
              TreeNodeElement* _l;
 
              TreeNodeElement* _r;
 
              bool _tag;
};
 
typedef TreeNodeElement* TreeNode;
//构造函数的定义,前序和中序中相似,只是不学要_tag域
TreeNodeElement::TreeNodeElement()
{
       _value = -1;
 
       _l = NULL;
 
       _r = NULL;
 
       _tag = false;
}
 
TreeNodeElement::TreeNodeElement(int value)
{
       _value = value;
 
       _l = NULL;
 
       _r = NULL;
 
       _tag = false;
}
 
TreeNodeElement::TreeNodeElement(int value,TreeNodeElement* l,TreeNodeElement* r)
{
       _value = value;
 
       _l = l;
 
       _r = r;
 
       _tag = false;
}
 
TreeNodeElement::~TreeNodeElement()
{
       delete _l;
              delete _r;
}
//递归实现(visit)
void Visit(TreeNode node)
{
       cout<_value<<" ";
}
       
二叉树后序遍历的递归和非递归实现:
//递归遍历
void PostRetriveATree(TreeNode root,void (* visit)(TreeNode))
{
       if (root)
       {
              PostRetriveATree(root->_l,visit);
              PostRetriveATree(root->_r,visit);
              (*visit)(root);
       }
}
//非递归遍历,添加#include
void PostRetriveATreeWithoutRecurve(TreeNode root,void (* visit)(TreeNode))
{
       stack tree;
 
       while ((root != NULL) || (!tree.empty()))
       {
              while (root != NULL)
              {
                     tree.push(root);
 
                     root = root->_l;
              }
 
              if (!tree.empty())
              {
                     root = tree.top();
 
                     if (root->_tag)  //可以访问
                     {
                            visit(root);
 
                            tree.pop();
                           
                            root = NULL; //第二次访问标志其右子树也已经遍历
                     }
                     else
                     {
                            root->_tag = true;
                            root = root->_r;
                     }
              }
       }
}
阅读(267) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:IIOP

给主人留下些什么吧!~~