一般遍历二叉树的方法为使用递归或者栈,如果希望不使用存储结构对二叉树进行遍历,则每个节点需要引入指向父节点的指针。
基本思路为:根据分析发现,对每个节点遍历的过程中,游走顺序是固定的,按前驱节点顺序为:从父节点进入-》从左孩子进入-》从右孩子进入,由此可将每次遍历到一个节点的情况分为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; //进入父节点
}
}
}