教科书上多数只有二叉树递归遍历的代码实现,现在我来分享一下通过二叉树的非递归遍历来初始化和读取二叉树

二叉树的结点结构:

//二叉树的结点结构
typedef struct My_BitreeNode
{//数据域ElemType data;//左子树指针My_BitreeNode* lchild;//右子树指针My_BitreeNode* rchild;
}My_BitreeNode, * My_BitreePointer;

向二叉树输入数据(前序遍历非递归)

//向二叉树输入数据(前序遍历非递归)
void CreateBiTree_front(My_BitreePointer& T)
{My_BitreePointer q[100]; //定义q数组作为队列存放二叉链表中结点,100为最大容量My_BitreePointer s;   //二叉链表中的结点,用来遍历int i, j;char ch;T = NULL;              //结点的data域值printf("请输入结点的编号和值:\n");cin >> i >> ch;while (ch != '#' && i != 0)     //输入值为#号,算法结束{s = new My_BitreeNode;s->data = ch;s->lchild = NULL;s->rchild = NULL;q[i] = s;//将结点的地址装入队列数组,编号为i的结点的地址装入下标为i的存储单元if (i == 1)T = s;else{j = i / 2;//找父节点的地址if (i % 2 == 0)q[j]->lchild = s;elseq[j]->rchild = s;}printf("请输入结点的编号和值:\n");cin >> i >> ch;}
}

二叉树的性质:对于有n个结点的二叉树的第i个结点,如果i=1,则结点i是二叉树的根,无双亲,如果i>1,则其双亲为结点[i/2]

如果2i>n,则结点没有左孩子(结点i为叶子结点),否则其左孩子是2i

如果2i+1>n,则结点没有右孩子,否则其右孩子是2i+1

这个非递归遍历输入数据的主要思路是创建了一个储存所有结点指针的数组,在用户输入数据的时候,将对应编号的结点指针储存在相同下标下的数组中(编号与数组下标相对应),这样就能通过数组的下标找到结点在树中的位置,而根据上面所说的二叉树的性质,我们就能通过当前结点的编号和很轻易的找出它的双亲,也能判断它是双亲的左孩子还是右孩子。(能整除2的是左孩子,不能整除2的就是右孩子)。

在遍历过程中先根据用户输入的数据创建出一个结点,根据用户输入的编号将该结点的地址存放到数组相应的位置,再在数组中找到该结点双亲的位置,判断该结点是左孩子还是右孩子后便可将结点接入二叉树中,在输入的时候我们最好用层序遍历的方法输入结点的数据,因为该程序我们要确保在输入结点的时候,它的双亲已经被输入,要不然没有双亲,子结点就无法连入二叉树中。

前序输出二叉树(非遍历算法)

//前序输出二叉树(非遍历算法)
void PrintBitree_front(My_BitreePointer& T)
{//判断二叉树是否为空if (T == NULL){return;}//用来储存结点指针的栈My_BitreePointer m_Stack[100];//栈顶指针int S_top = -1;//用来遍历二叉树的指针pMy_BitreePointer p=T;//结束遍历二叉树的条件while (p || S_top != -1){//遍历左子树while (p){cout << p->data << " ";//将当前结点的指针放入栈中,便于一会左子树遍历完时回溯来遍历右子树m_Stack[++S_top] = p;p = p->lchild;}//当栈中有数据就可回溯if (S_top != -1){//回溯到栈顶所储存的指针处p = m_Stack[S_top--];//让指针p遍历当前结点的右子树p = p->rchild;}}
}

非递归算法输出二叉树主要是利用了栈(实际上递归的算法也是利用了栈,只不过是利用了系统自带的栈),我们创建一个栈来记录已经遍历过的结点的地址,利用栈的结构就保证了在栈顶的结点就是之前遍历过的结点,方便遍历指针的回溯,而同一个结点只会回溯一次,所以回溯过后就可以在栈中将栈顶的结点删除(理解的时候具体画一颗二叉树再根据程序模拟遍历的过程能更好的理解)

二叉树非递归遍历(前序遍历)相关推荐

  1. 二叉树非递归后序遍历算法(C语言)

    二叉树非递归后序遍历算法(C语言) 二叉树后序遍历的规律:左右根 后序非递归遍历中,访问根(子根)结点有两种情况 ①:遍历完左子树,需要遍历右子树,需要从栈中访问最顶上的根(子根)结点从而得到右子树的 ...

  2. 二叉树非递归后序遍历算法的一种简单思路

    首先从简单的例子开始 1 2 3 上图二叉树的后序遍历序列是"231", 颠倒一下就是"132", 而其前序遍历是"123" 有什么发现? ...

  3. 二叉树非递归先序遍历

    二叉树的递归先序遍历很简单,假设二叉树的结点定义如下: 1 struct BinaryTreeNode 2 { 3 int m_nValue; 4 BinaryTreeNode* m_pLeft; 5 ...

  4. 二叉树非递归后序遍历算法

    与正常的非递归中序遍历算法不同于两点: 一  比正常的中序遍历算法多了对数据元素的标记. 在压数据元素入栈(标记记为0,用来表示访问了其左子树)时标记, 还有访问完左子树利用gettop()获取双亲通 ...

  5. 二叉树非递归中序遍历

    二叉树的中序遍历 为什么把中序遍历放在最前面呢,因为在非递归遍历中,这个是最简单也是最容易理解的,所以放在第一个的位置. 中序遍历的递归算法很简单,但是想要非递归的实现,就要用到栈这个数据结构, 那么 ...

  6. 不用栈实现二叉树非递归中序遍历

    偶尔看到这样一个问题: 有个二叉树,每个节点除了左右指针外,还有一个指向父节点的指针. 要求不用递归,中序遍历这棵树.另要求空间复杂度是O(1). 空间复杂度为O(1),摆明就是不让用堆栈模拟递归,所 ...

  7. 二叉树非递归后序遍历

    /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *rig ...

  8. 二叉树非递归后序遍历的三种办法

    方法一: 双栈,利用生成先序序列思路,左--右依次入栈再出栈,得到头--右--左的序列,再将该序列入另一栈再出栈,得到左--右--头序列: void PostOrder_1(Bitree *T) {T ...

  9. 面试题 7 :二叉树遍历-前序遍历(DLR),中序遍历(LDR),后序遍历(LRD)-Android端非递归实现

    二叉树实体定义: /*** Author: Heynchy* Date: 2019/6/24* <p>* Introduce: 二叉树的定义*/ public class TreeNode ...

  10. 非递归先序遍历二叉树总结(3种方法)

    算法 非递归先序遍历二叉树总结(3种方法) @author:Jingdai @date:2020.12.03 传送门 非递归中序遍历二叉树 非递归后序遍历二叉树 递归先序遍历二叉树非常的简单,但是面试 ...

最新文章

  1. 2021年大数据ELK(九):使用VSCode测试分词器
  2. 如何真正理解用Nginx代理来解决同源策略
  3. 算法导论 6.2-5
  4. idea springboot 无法run_2021 最新版 Spring Boot 速记教程
  5. mysql查询过程从客户端发送查询请求_MySQL查询过程和高级查询
  6. QT 中的 Graphics View 系统
  7. vs 窗体连接mysql_vs2008 c#开发windows窗体程序,怎么连接数据库?
  8. 新书《编写可测试的JavaScript代码 》出版,感谢支持
  9. LeetCode 1284. 转化为全零矩阵的最少反转次数(BFS 矩阵状态编码解码)
  10. 升级Struts2.5后使用DMI动态方法调用遇到问题
  11. mysql 绕过权限检查_跳过权限检查,强制修改mysql密码
  12. 去掉日志服务器性能,日志服务器及性能监控
  13. idea 模块jdk依赖总是自动变_解决IDEA中导入新的maven依赖后Language Level自动重置问题...
  14. STM32(一)- 基于固件库的工程模板
  15. 不同的核函数对支持向量机分类性能的影响
  16. SQL Server 2005的Resource数据库
  17. Linux开源字体——“文泉驿正黑”的安装命令
  18. agd插值算法_插值算法(一):各种插值方法比较
  19. 大数据薪水大概多少_大数据工程师工资待遇一般多少?高吗
  20. Skywalking全链路追踪使用说明

热门文章

  1. 随机抖音接口php,【php】下载抖音无水印视频接口
  2. 对数函数log()用法
  3. 【数据结构】EOJ 1006. 线性链表的插入与删除
  4. Pytorch控制打印矩阵的格式
  5. 拼多多显示服务器有点问题,拼多多打不开网页怎么回事
  6. 文电通PDF编辑转换器[DocuCom PDF Gold] 9.1R2下载和破解补丁
  7. 翰文付费打印后还有水印吗_翰文进度计划编制系统去除水印中文增强版
  8. 邪少微信自定义分享卡片链接的解决方案(可自定义分享标题 自定义分享链接 分享描述 分享缩略图)
  9. UG与PROE哪个好用,主要看是用在哪里
  10. pojo类继承pojo类_如何编写更好的POJO服务