左孩子右兄弟树的递归与非递归、深度与广度遍历

http://blog.chinaunix.net/uid-21712186-id-1818095.html

左孩子右兄弟存储方式:     

struct tree_node
{
  int data;
  tree_node* first_child;
  tree_node* sibling;
}

一个观念必须要有: root没有兄弟sibling,根是独立的,代表这一棵树---------忘记了绝不会写递归了。


(A) 深度遍历:        
    (1)递归算法:
       先根遍历 void   preOrder(tree_node * root)
                      {
                         if (!root)
                             return;
                         printf(root->data);
                         tree_node* p;
                         for(p=root->first_child;p,p=p->sibling)
                         {
                             preOrder(p);
                         }
                      }
       后根遍历 void   postOrder(tree_node * root)
                      {
                         if (!root)
                             return;
                         tree_node* p;
                         for(p=root->first_child;p,p=p->sibling)
                         {
                             preOrder(p);
                         }
                         printf(root->data);
                      }
    (2)非递归算法:      
                    记忆技巧是将节点看成是二叉树,因为树对应的二叉树的         
                    先序与树的先根遍历序列是一致的,这是公认的事实。
        先根遍历 void  preOrder(tree_node* root)
                      {
                         stack sk;
                         while(root  ||  !sk.empty())
                         {
                              while(root)
                              {
                                  printf(root->data);
                                  sk.push(root);
                                  root=root->first_child;
                              }
                              root=sk.top(); sk.pop();//STL要求这样做的
                              root=root->sibling; //root可以为空的
                         }
                      }
                    记忆技巧是将节点看成是二叉树,因为树对应的二叉树的         
                    中序与树的后根遍历序列是一致的,这是公认的事实。
        后根遍历 void  postOrder(tree_node* root)
                      {
                         stack sk;
                         while(root  ||  !sk.empty())
                         {
                              while(root)
                              {                                  
                                  sk.push(root);
                                  root=root->first_child;
                              }
                              root=sk.top();sk.pop();//STL要求这样做的
                              printf(root->data);
                              root=root->sibling;//root可以为空的
                         }
                      }

(B)广度遍历(按层次次序遍历树的算法) 
   用队列实现
   void levelOrde(tree_node* root)
   {
      queue q;
      q.push(root);

      while(!q.empty())
      {
                  root=q.font();q.pop();
                  printf(root->data);
                  root=root->first_child;
                  while(!root)
                  {
                      q.push(root);
                      root=root->sibling;
                   }
      }
   }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值