二叉树的非递归遍历

二叉树遍历算法

      个人觉得借助栈或队列的非递归只是另一种形式的递归。当然这种方式对于效率的提高还是有好处的。
      先序遍历很简单,根指针入栈,然后不断出栈,右孩子入栈,左孩子入栈:

Code:
  1. void pre_order(struct BiTNode *T, void (*visit)(TElemType e))   
  2. {   
  3.     struct stack *s;   
  4.     struct BiTNode *p;   
  5.        
  6.     if (T != NULL) {   
  7.         s = init_stack();   
  8.         push(s, T);   
  9.         while (! stack_empty(s)) {   
  10.             p = top(s);   
  11.             pop(s);   
  12.             visit(p->data);   
  13.             if (p->rchild != NULL) {   
  14.                 push(s, p->rchild);   
  15.             }   
  16.             if (p->lchild != NULL) {   
  17.                 push(s, p->lchild);   
  18.             }   
  19.         }   
  20.     }
  21.     destory_stack(s);
  22. }  

      中序遍历:首先根指针入栈、遍历左子树,出栈,遍历右子树:

Code:
  1. void in_order(struct BiTNode *T, void (*visit)(TElemType e))   
  2. {   
  3.     struct stack *s;   
  4.     struct BiTNode *p;   
  5.        
  6.     p = T;   
  7.     s = init_stack();   
  8.     while (p != NULL || ! stack_empty(s)) {   
  9.         if (p != NULL) { /* push the root pointer, and traverse the left child tree */  
  10.             push(s, p);   
  11.             p = p ->lchild;   
  12.         }    
  13.         else { /* pop and  visit the pointer, traverse the right child tree */  
  14.             p = top(s);   
  15.             pop(s);   
  16.             visit(p->data);   
  17.             p = p->rchild;   
  18.         }   
  19.     }
  20.     destory_stack(s);  
  21. }  

      后序遍历:根指针入栈、遍历左子树,根据右孩子的值判断是否出栈,遍历右子树:

Code:
  1. void post_order(struct BiTNode *T, void (*visit)(TElemType e))   
  2. {   
  3.     struct stack *s;   
  4.     struct BiTNode *p, *pre;/* pre means recently visit */  
  5.   
  6.     p = T;   
  7.     pre = NULL;   
  8.     s = init_stack();   
  9.     while (p != NULL || ! stack_empty(s)) {   
  10.         if (p != NULL ) {   
  11.             push(s, p);   
  12.             p = p->lchild;   
  13.         }   
  14.         else {   
  15.             p = top(s);   
  16.             if (p->rchild == NULL || p->rchild == pre) {   
  17.                 visit(p->data);   
  18.                 pop(s);   
  19.                 pre = p;   
  20.                 p = NULL;   
  21.             }   
  22.             else {   
  23.                 p = p->rchild;   
  24.             }   
  25.         }   
  26.     }
  27.     destory_stack(s);
  28. }  

      层次遍历:很简单,根指针入队,出队,左孩子入队,右孩子入队:

Code:
  1. void level_order(struct BiTNode *T, void (*visit)(TElemType e))   
  2. {   
  3.     struct queue *q;   
  4.     struct BiTNode *p;   
  5.        
  6.     p = T;   
  7.     q = init_queue();   
  8.     if (T != NULL) {   
  9.         en_queue(q, p);   
  10.         while(! queue_empty(q)) {   
  11.             p = gethead(q);   
  12.             de_queue(q);   
  13.             visit(p->data);   
  14.             if (p->lchild != NULL) {   
  15.                 en_queue(q, p->lchild);   
  16.             }   
  17.             if (p->rchild != NULL) {   
  18.                 en_queue(q, p->rchild);   
  19.             }   
  20.         }   
  21.     }
  22.     destory_queue(q);  
  23. }  

 

【最优潮流】直流最优潮流(OPF)课设(Matlab代码实现)内容概要:本文档主要围绕“直流最优潮流(OPF)课设”的Matlab代码实现展开,属于电力系统优化领域的教学与科研实践内容。文档介绍了通过Matlab进行电力系统最优潮流计算的基本理与编程实现方法,重点聚焦于直流最优潮流模型的构建与求解过程,适用于课程设计或科研入门实践。文中提及使用YALMIP等优化工具包进行建模,并提供了相关资源下载链接,便于读者复现与学习。此外,文档还列举了大量与电力系统、智能优化算法、机器学习、路径规划等相关的Matlab仿真案例,体现出其服务于科研仿真辅导的综合性平台性质。; 适合人群:电气工程、自动化、电力系统及相关专业的本科生、研究生,以及从事电力系统优化、智能算法应用研究的科研人员。; 使用场景及目标:①掌握直流最优潮流的基本理与Matlab实现方法;②完成课程设计或科研项目中的电力系统优化任务;③借助提供的丰富案例资源,拓展在智能优化、状态估计、微电网调度等方向的研究思路与技术手段。; 阅读建议:建议读者结合文档中提供的网盘资源,下载完整代码与工具包,边学习理论边动手实践。重点关注YALMIP工具的使用方法,并通过复现文中提到的多个案例,加深对电力系统优化问题建模与求解的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值