不使用存储结构(非栈、非递归)遍历二叉树
来源:互联网 发布:mac怎么看不到移动硬盘 编辑:程序博客网 时间:2024/06/05 12:55
一般遍历二叉树的方法为使用递归或者栈,如果希望不使用存储结构对二叉树进行遍历,则每个节点需要引入指向父节点的指针。
基本思路为:根据分析发现,对每个节点遍历的过程中,游走顺序是固定的,按前驱节点顺序为:从父节点进入-》从左孩子进入-》从右孩子进入,由此可将每次遍历到一个节点的情况分为3个状态,即:状态0:,从父节点进入当前节点;状态1,从左孩子进入当前节点;状态2,从右孩子进入当前节点,由此便可以根据状态判断,遍历每个节点。
代码如下:
#include <stdio.h>void Print(BTNode* pRoot){ BTNode* pNode = pRoot; int flag = 0; while(pNode) { switch(flagg) case 0: //状态1,即从父节点来到当前节点 { if(pNode->m_pLeft) //存在左孩子,则进入左孩子 { pNode = pNode->m_pLeft; break; } } case 1: //状态2,即从左孩子来到当前节点,或状态1中的判断失效(不存在左孩子) { printf("%d\n", pNode->m_nValue); //访问当前节点,此处为打印操作 if(pNode->m_pRight) //存在右孩子,则进入右孩子 { pNode = pNode->m_pRight; flag = 0; break; } } case 2: //状态3,即从右孩子来到当前节点,或状态1、状态2中之前的判断失效 { if(!pNode->m_pParents); //不存在父节点,即当前节点为根节点 else if(pNode->m_pParents->m_pLeft == pNode) //当前节点为父节点的左孩>子,则进入父节点时为状态1 flag = 1; else //当前节点为父节点的有孩子,则进入父节点时为状态2 flag = 2; pNode = pNode->m_pParents; //进入父节点 } }}
- 不使用存储结构(非栈、非递归)遍历二叉树
- 二叉树采用三叉链表的存储结构,不借助栈的非递归中序遍历
- 二叉树的非递归中序遍历(二叉线索存储结构)
- 二叉树的非递归遍历(使用栈)
- 基于三叉链表存储结构的二叉树的不用栈的非递归遍历
- C++ 二叉树(三叉链表存储)不使用栈的非递归算法
- 用二叉链表存储结构构造一棵二叉树,然后用栈结构进行非递归遍历
- 二叉树遍历(递归,非递归)
- 使用非递归遍历二叉树
- 二叉树非递归遍历,不使用栈(前序,中序,后续)
- 使用栈,非递归先序遍历二叉树T
- 使用栈,非递归中序遍历二叉树T
- 使用栈,非递归后序遍历二叉树PT
- 二叉树的递归与非递归遍历(二叉链表结构)
- 运用栈非递归遍历二叉树
- 二叉树遍历(非递归)
- 二叉树的遍历(非递归)
- 二叉树遍历(非递归版)
- Linux命令之basename 命令
- CreateThread, AfxBeginThread,_beginthread, _beginthreadex的区别
- C#界面闪烁问题解决方案
- app_field.set_dependent_field /clear_dependent_fields
- Boost
- 不使用存储结构(非栈、非递归)遍历二叉树
- TCP/IP滑动窗口
- linux后台开发常用调试工具
- SQL Server中char、nchar、varchar、nvarchar的区别
- 面试java基础
- 进程及相关API
- Eclipse 常用快捷键
- Makefile和shell脚本的区别
- linux下vi命令大全