博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二叉树遍历非递归算法
阅读量:5014 次
发布时间:2019-06-12

本文共 1855 字,大约阅读时间需要 6 分钟。

递归算法非常的简单。先访问跟节点,然后访问左节点,再访问右节点。如果不用递归,那该怎么做呢?仔细

一.先序遍历

  看一下递归程序,就会发现,其实每次都是走树的左分支(left),直到左子树为空,然后开始从递归的最深处返回,然后开始恢复递归现场,访问右子树。

由于一直走到最左边后,需要逐步返回到父节点访问右节点,因此必须有一个措施能够对节点序列回溯。

  可以用栈记忆:在访问途中将依次遇到的节点保存下来。由于节点出现次序与恢复次序是反序的,因此是一个先

进后出结构,需要用栈;还可以节点增加指向父节点的指针。 

void preOrder1(TNode* root) {     Stack S;     while ((root != NULL) || !S.empty())     {         if (root != NULL)         {             Visit(root);             S.push(root);       // 先序就体现在这里了,先访问,再入栈             root = root->left;  // 依次访问左子树         }         else         {             root = S.pop();     // 回溯至父亲节点             root = root->right;         }     } }

  

void preOrder2(TNode* root) {     if ( root != NULL)     {         Stack S;         S.push(root);         while (!S.empty())         {             TNode* node = S.pop();              Visit(node);          // 先访问根节点,然后根节点就无需入栈了             S.push(node->right);  // 先push的是右节点,再是左节点             S.push(node->left);         }     } }

  

二.中序遍历

  

void InOrder1(TNode* root) {     Stack S;     while ( root != NULL || !S.empty() )     {         while( root != NULL )   // 左子树入栈         {             S.push(root);             root = root->left;         }         if ( !S.empty() )         {             root = S.pop();             Visit(root->data);   // 访问根结点             root = root->right;  // 通过下一次循环实现右子树遍历         }     } }

  

 

三.后序遍历

  不写了……

四.层次遍历

  

// 层序遍历伪代码:非递归版本,用队列完成 void LevelOrder(TNode *root) {     Queue Q;     Q.push(root);     while (!Q.empty())     {         node = Q.front();        // 取出队首值并访问         Visit(node);         if (NULL != node->left)  // 左孩子入队         {                       Q.push(node->left);             }         if (NULL != node->right) // 右孩子入队         {             Q.push(node->right);         }     } }

  

参考文献:

 

  

转载于:https://www.cnblogs.com/hxsyl/archive/2013/06/07/3123588.html

你可能感兴趣的文章
记忆--1.致我们不可缺少的记忆
查看>>
lintcode28- Search a 2D Matrix- easy
查看>>
react项目
查看>>
C# 万年历 农历 节气 节日 星座 星宿 属相 生肖 闰年月 时辰(转)
查看>>
A Simple Tree Problem
查看>>
Modular Inverse [ZOJ 3609]
查看>>
MySQL性能测试工具之mysqlslap使用详解
查看>>
深入理解jsonp跨域请求原理
查看>>
regsvr32注册COM组件失败
查看>>
jmeter,CSV数据加载、数据库连接、正则
查看>>
(独孤九剑)--正则表达式
查看>>
MySQL学习点滴 --分区表
查看>>
4.6.1 测试基础
查看>>
洛谷 P2486 [SDOI2011]染色
查看>>
oo第三单元总结
查看>>
leetcode : Count and Say [基本功]
查看>>
洛谷 P2485 [SDOI2011]计算器 解题报告
查看>>
c#访问存储过程
查看>>
Slickflow.NET 开源工作流引擎基础介绍(三) -- 基于HTML5/Bootstrap的Web流程设计器
查看>>
Node教程
查看>>