王道数据结构 (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("先序遍历:\t");
  InOrderTraverse(Tree);
  printf("\n");
  return 0;
}
复制代码

输出:

 

 

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

 

posted @   1点  阅读(659)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决
历史上的今天:
2019-07-31 vue 自定义封装组件 使用 model 选项
点击右上角即可分享
微信分享提示