非递归创建二叉树(中序)算法核心思路:
1)从根节点到左子树的叶子节点(创建节点、节点压栈);
2)记录每个节点的状态分三种情况:初始状态、左子树建立完成状态、右子树建立完成状态;
3)左右子树创建完成之后向上返回(出栈直到栈为空);
具体代码如下:
binary_tree.h
#ifndef _BINARY_TREE_H
#define _BINARY_TREE_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BINTREE_MAX_SIZE 128
#define STACK_ERR (-1);
#define STACK_SUCCESS 0
#define BIN_TREE_ERR (-1)
#define BIN_TREE_SUCCESS 0
typedef enum node_status {
NODE_INIT,
NODE_LEFT_BUILD,
NODE_RIGHT_BUILD
}NodeStatus;
typedef struct binary_node{
char nodeValue;
NodeStatus status;
struct binary_node *leftChild;
struct binary_node *rightChild;
}*PBinTree, BinTree;
typedef PBinTree DataType;
typedef struct link_stack_node {
DataType data;
struct link_stack_node *next;
}*PStackNode, StackNode;
typedef struct link_stack {
int size;
PStackNode top;
}*PStack, Stack;
/* 创建一个空的顺序栈 */
PStack CreateStack();
/* 判断一个栈是否为空 */
int StackIsEmpty(const PStack stack);
/* 进栈/压栈 */
void PushIntoStack(PStack stack, const DataType data);
/* 出栈/弹栈 */
void PopFromStack(PStack stack);
/* 获取栈顶元素 */
DataType GetTop(const PStack stack);
/* 获取栈的大小 */
int GetStackSize(const PStack stack);
/* 销毁一个顺序栈 */
void DestroyStack(PStack stack);
/* 递归创建一个二叉树 */
PBinTree CreateBinTree(PBinTree tree);
/* 二叉树先序遍历 */
void PreTraverTree(PBinTree tree);
/* 二叉树后序遍历 */
void PostTraverTree(PBinTree tree);
/* 二叉树中序遍历 */
void InTraverTree(PBinTree tree);
#endif
bianry_tree.c
#include "binary_tree.h"
PStack CreateStack()
{
PStack stack = (PStack)malloc(sizeof(Stack));
if(stack == NULL