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

  • 相关阅读:
    手机号不能为空
    选项卡套选项卡
    可以在一个html的文件当中读取另一个html文件的内容
    价格计算
    v形 加强版
    V形
    生成100个Div
    伪元素::after和::before
    数组中的toString,toLocalString,valueOf方法有什么区别
    JavaScript toLocaleString() 方法
  • 原文地址:https://www.cnblogs.com/guangzhou11/p/13410419.html
Copyright © 2011-2022 走看看