• 二叉树的非递归遍历


    全部代码

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <assert.h>
      4 
      5 typedef struct node
      6 {
      7     int nValue;
      8     struct node *pLeft;
      9     struct node *pRight;
     10 }BiTree;
     11 
     12 typedef struct node2
     13 {
     14     BiTree *nValue;
     15     struct node2 *pNext;
     16 }MyStack;
     17 
     18 typedef struct node3
     19 {
     20     int nCount;
     21     MyStack *pTop;
     22 }Stack;
     23 
     24 void s_Init(Stack **ppStack)
     25 {
     26     assert(ppStack != NULL);
     27 
     28     *ppStack = (Stack *)malloc(sizeof(Stack));
     29     if(NULL == *ppStack)
     30     {
     31         printf("栈空间分配失败!
    ");
     32         exit(-1);
     33     }
     34     (*ppStack)->nCount = 0;
     35     (*ppStack)->pTop = NULL;
     36 }
     37 
     38 void s_Push(Stack *pStack, BiTree *nNum)
     39 {
     40     MyStack *pTemp = NULL;
     41 
     42     assert(pStack != NULL);
     43 
     44     //临时节点开辟空间
     45     pTemp = (MyStack *)malloc(sizeof(MyStack));
     46     if(NULL == pTemp)
     47     {
     48         printf("临时节点空间分配失败!
    ");
     49         exit(-1);
     50     }
     51     pTemp->nValue = nNum;
     52     pTemp->pNext = NULL;
     53 
     54     //头添加
     55     //临时节点的下一个是头节点
     56     pTemp->pNext = pStack->pTop;
     57     //新节点是新栈顶
     58     pStack->pTop = pTemp;
     59 
     60     //更新栈内元素
     61     ++pStack->nCount;
     62 }
     63 
     64 BiTree *s_Pop(Stack *pStack)
     65 {
     66     BiTree *nNum;
     67     MyStack *pDel = NULL;
     68 
     69     assert(pStack!=NULL && pStack->pTop!=NULL);
     70 
     71     //标记  要删除的节点
     72     pDel = pStack->pTop;
     73     nNum = pStack->pTop->nValue;
     74     //栈顶指针下移
     75     pStack->pTop = pStack->pTop->pNext;
     76     //释放空间
     77     free(pDel);
     78     pDel = NULL;
     79 
     80     //更新栈内元素
     81     --pStack->nCount;
     82 
     83     return nNum;
     84 }
     85 
     86 //递归创建二叉树
     87 void RecCreateBiTree(BiTree **ppRoot)
     88 {
     89     int nNum;
     90 
     91     assert(ppRoot!=NULL);
     92 
     93     //输入节点的值
     94     scanf("%d", &nNum);
     95 
     96     //检测是否是结束标志
     97     if(0 == nNum)
     98     {
     99         return;
    100     }
    101 
    102     *ppRoot = (BiTree *)malloc(sizeof(BiTree));
    103     if(NULL == *ppRoot)
    104     {
    105         printf("*ppRoot空间分配失败!");
    106         exit(-1);
    107     }
    108     (*ppRoot)->nValue = nNum;
    109     (*ppRoot)->pLeft = NULL;
    110     (*ppRoot)->pRight = NULL;
    111 
    112     //处理当前节点的左和右
    113     RecCreateBiTree(&(*ppRoot)->pLeft);
    114     RecCreateBiTree(&(*ppRoot)->pRight);
    115 }
    116 
    117 //非递归前序遍历
    118 void UnRecPrevOrderTraversal(BiTree *pRoot)
    119 {
    120     Stack *pStack = NULL;
    121 
    122     assert(pRoot!=NULL);
    123 
    124     //申请辅助栈
    125     s_Init(&pStack);
    126 
    127     while(1)
    128     {
    129         //打印根  处理左
    130         while(pRoot!=NULL)
    131         {
    132             printf("%d ", pRoot->nValue);
    133             s_Push(pStack, pRoot);
    134             pRoot = pRoot->pLeft;
    135         }
    136 
    137         //栈顶节点弹出  处理右子树
    138         pRoot = s_Pop(pStack);
    139 
    140         //栈空  树遍历结束
    141         if(NULL == pRoot)
    142         {
    143             return;
    144         }
    145 
    146         //处理右
    147         pRoot = pRoot->pRight;
    148     }
    149 }
    150 
    151 //非递归中序遍历
    152 void UnRecMidOrderTraversal(BiTree *pRoot)
    153 {
    154     Stack *pStack = NULL;
    155 
    156     assert(pRoot!=NULL);
    157 
    158     //申请辅助栈
    159     s_Init(&pStack);
    160 
    161     while(1)
    162     {
    163         //处理左
    164         while(pRoot)
    165         {
    166             s_Push(pStack, pRoot);
    167             pRoot = pRoot->pLeft;
    168         }
    169 
    170         //栈顶节点弹出
    171         pRoot = s_Pop(pStack);
    172 
    173         //栈空  树遍历结束
    174         if(NULL == pRoot)
    175         {
    176             return;
    177         }
    178 
    179         //打印左
    180         printf("%d ", pRoot->nValue);
    181 
    182         //处理右
    183         pRoot = pRoot->pRight;
    184     }
    185 }
    186 
    187 //非递归后序遍历
    188 void UnRecLastOrderTraversal(BiTree *pRoot)
    189 {
    190     Stack *pStack = NULL;
    191     BiTree *pFlag = NULL;
    192 
    193     assert(pRoot!=NULL);
    194 
    195     //申请辅助栈
    196     s_Init(&pStack);
    197 
    198     while(1)
    199     {
    200         //处理左
    201         while(pRoot)
    202         {
    203             s_Push(pStack, pRoot);
    204             pRoot = pRoot->pLeft;
    205         }
    206 
    207         //空栈 结束
    208         if(NULL == pStack->pTop)
    209         {
    210             return;
    211         }
    212 
    213         //栈顶元素的右为空  或者已经被处理过 弹出  标记
    214         if(NULL==pStack->pTop->nValue->pRight || pStack->pTop->nValue->pRight==pFlag)
    215         {
    216             pFlag = s_Pop(pStack);
    217             printf("%d ", pFlag->nValue);
    218         }
    219         //未被处理过  继续处理右
    220         else
    221         {
    222             pRoot = pStack->pTop->nValue->pRight;
    223         }
    224     }
    225 }
    226 
    227 int main(void)
    228 {
    229     BiTree *pRoot = NULL;
    230     RecCreateBiTree(&pRoot);
    231     UnRecPrevOrderTraversal(pRoot);
    232     printf("
    ");
    233     UnRecMidOrderTraversal(pRoot);
    234     printf("
    ");
    235     UnRecLastOrderTraversal(pRoot);
    236     printf("
    ");
    237 
    238     return 0;
    239 }
  • 相关阅读:
    css之background与第15周css补充内容叠用
    ios wkwebview didReceiveAuthenticationChallenge crash解决
    ios 版本更新提示-硬更新/软更新
    ios_UITextField-修改占位文字和光标的颜色,大小
    ios_UITextField右侧小圆叉
    ios_中将UITextField输入框设置为密码形式
    系统UISearchController详解
    iOS开发实战之搜索控制器UISearchController使用
    在iOS中如何正确的实现行间距与行高
    iOS alertController自带的输入框
  • 原文地址:https://www.cnblogs.com/chen-cai/p/7845333.html
Copyright © 2020-2023  润新知