多叉树的递归遍历和堆栈遍历【多叉树的前序遍历及后续遍历】

//多叉树递归遍历

//假设树节点定义为:

struct Node{
   Node *pPNode;
   list<Node *> childs;
};

//前序遍历(正序遍历):

void EnumNode(Node *pNode)
{

  do_something(pNode);

  list<Node *>::iterator iter; //正向遍历器

  for(iter=pNode->childs.begin();iter!=pNode->childs.end();++iter)
  {
     EnumNode(*iter);
  }

}

//后序遍历(反序遍历):

void REnumNode(Node *pNode)
{

  list<Node *>::reverse_iterator iter; //反向遍历器

  for(iter=pNode->childs.rbegin();iter!=pNode->childs.rend();++iter)
  {
     EnumNode(*iter);
  }

  do_something(pNode);

}

//多叉树堆栈遍历

//前序遍历(正序遍历):

void EnumNode(Node *pRoot)
{
  stack<Node *> stack;
  stack.push(pRoot);
  Node *lpNode;

  while(!stack.empty())
  {
      lpNode = stack.top();
      stack.pop();

      do_something(lpNode);

      list<Node *>::reverse_iterator iter; //反向遍历器

      for(iter=pNode->childs.rbegin();iter!=pNode->childs.rend();++iter)
      {
         stack.push(*iter);
      }
  }

}

//后序遍历(反序遍历):

void REnumNode(Node *pRoot)
{
  stack<Node *> stack;
  stack.push(pRoot);
  Node *lpNode;
  Node *lpLastNode=NULL; //保存最近一次处理的节点,或者说某个节点的第一个子节点

  while(!stack.empty())
  {
      lpNode = stack.top();

      //lpLastNode!=*lpNode->childs.begin() //起关键性作用,防止再次进入已经处理过的节点
      if (lpNode->childs.size() && lpLastNode!=*lpNode->childs.begin())
      {

         list<Node *>::iterator iter; //正向遍历器

         for(iter=pNode->childs.begin();iter!=pNode->childs.end();++iter)
         {
            stack.push(*iter);
         }

      }else{

         do_something(lpNode);

         lpLastNode=lpNode;
         stack.pop();

      }
  }

}

/*
关于后续遍历,程序流程是这样的:

1.从根出发
2.寻找含有的节点
3.找到后,正序push到堆栈
4.取栈定节点,继续执行第2步
4.直到找到没有子叶的节点
5.开始处理,保存处理的节点指针
6.pop节点, Go Setp 2

注:以上代码非可直接运行代码,算法却清晰明了,稍加改动就可以使用。
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值