不使用存储结构(非栈、非递归)遍历二叉树

来源:互联网 发布: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;  //进入父节点        }    }}


 

原创粉丝点击