王道数据结构 (10) 树的先序遍历非递归代码实现

Posted 1点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了王道数据结构 (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

 

以上是关于王道数据结构 (10) 树的先序遍历非递归代码实现的主要内容,如果未能解决你的问题,请参考以下文章

用递归和非递归方式实现二叉树的先序中序后序遍历

二叉树的先序遍历-非递归实现

二叉树的先序中序后序递归与非递归实现遍历

二叉搜索树的先序中序后序非递归遍历代码

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历(非递归)