zoukankan      html  css  js  c++  java
  • 王道数据结构 (10) 树的先序遍历非递归代码实现

    先序遍历与中序遍历的代码实现是差不多的 只是把访问节点的操作放到了入栈操作前 

    代码实现:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define ElementType char
    int top = -1; //定义top栈顶元素下标
    
    // 结点结构体
    typedef struct BinTNode
    {
      ElementType data;
      struct BinTNode *left;
      struct BinTNode *right;
    } BinTNode, *BinTree;
    
    // 初始化树形结构
    BinTNode *CreateBiTree(BinTNode *T)
    {
      T = (BinTNode *)malloc(sizeof(BinTNode));
      T->data = 'A';
      T->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->data = 'B';
      T->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->right->data = 'C';
    
      T->left->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->left->data = 'D';
      T->left->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->right->data = 'E';
      T->left->right->left = NULL;
      T->left->right->right = NULL;
      T->left->left->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->left->left->data = 'H';
      T->left->left->left->left = NULL;
      T->left->left->left->right = NULL;
      T->left->left->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->left->left->right->data = 'I';
      T->left->left->right->left = NULL;
      T->left->left->right->right = NULL;
    
      T->right->left = (BinTNode *)malloc(sizeof(BinTNode));
      T->right->left->data = 'F';
      T->right->left->left = NULL;
      T->right->left->right = NULL;
      T->right->right = (BinTNode *)malloc(sizeof(BinTNode));
      T->right->right->data = 'G';
      T->right->right->left = NULL;
      T->right->right->right = NULL;
    
      return T;
    }
    
    // 栈 - 进栈push
    void push(BinTNode **stack, BinTNode *elem)
    {
      stack[++top] = elem;
    }
    
    //栈 - 弹栈pop
    void pop()
    {
      if (top == -1)
      {
        return;
      }
      top--;
    }
    
    // 遍历过程中,输出结点值
    void printElement(BinTNode *elem)
    {
      printf("%c ", elem->data);
    }
    
    //获取栈顶元素
    BinTNode *getTop(BinTNode **stack)
    {
      return stack[top];
    }
    
    //非递归遍历 - 左根右
    void InOrderTraverse(BinTNode *Tree)
    {
      BinTNode *stack[20]; // 定义一个栈
      BinTNode *p = Tree;  // 定义临时指针
      // 1 当前指针指向不为NULL - 说明有右孩子
      // 2 或者栈内不空 - 说明该指针处没有右孩子,继续弹出结点值
      while (p || top != -1)
      {
        while (p)
        {
          printElement(p);
          push(stack, p); // 循环将左孩子进栈
          p = p->left;
        }
        if (top != -1)
        {
          p = getTop(stack); //取栈顶元素
          pop();             //栈顶元素弹栈
          p = p->right;
        }
      }
    }
    
    int main()
    {
      BinTNode *Tree;
      Tree = CreateBiTree(Tree);
      printf("先序遍历:	");
      InOrderTraverse(Tree);
      printf("
    ");
      return 0;
    }

    输出:

    代码: https://gitee.com/guangzhou110/kingcraft_data_structure

  • 相关阅读:
    Samba 4.0 RC3 发布
    SymmetricDS 3.1.7 发布,数据同步和复制
    Express.js 3.0 发布,Node.js 的高性能封装
    GIFLIB 5.0.1 发布,C语言的GIF处理库
    jQuery UI 1.9.1 发布
    SVN Access Manager 0.5.5.14 发布 SVN 管理工具
    DynamicReports 3.0.3 发布 Java 报表工具
    HttpComponents HttpClient 4.2.2 GA 发布
    AppCan 2.0 正式发布,推移动应用云服务
    Ruby 2.0 的新功能已经冻结
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13410419.html
Copyright © 2011-2022 走看看