中序先遍历完根的左边到叶子节点再操作当前节点,再遍历右边,同栈后入先出的性质,可以用栈模拟。
把遍历看作压栈的过程,操作节点看作出栈拿数据,压完全部左节点再出栈叶子节点(当前根节点),再把叶子节点右孩子节点看作根节点,循环操作直到栈为空,注意,空节点不压入栈
BT.c
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef char BTDatatype;
typedef struct BinaryTreeNode {
BTDatatype val;
struct BinaryTreeNode* left;
struct BinaryTreeNode* right;
}BTNode;
typedef struct stack {
BTNode** array;
int size;
int capacity;
}ST;
void StackInit(ST*s)
{
assert(s);
s->array = NULL;
s->size = s->capacity = 0;
}
void StackExpansion(ST* s)
{
assert(s);
if (s->size == s->capacity)
{
int newcapacity = s->capacity == 0 ? 4 : s->capacity * 2;
BTNode** pcur;
pcur= (BTNode**)realloc(s->array, newcapacity*sizeof(BTNode*));
assert(pcur);
s->array = pcur;
s->capacity = newcapacity;
}
}
void StackPush(ST*s,BTNode* val)
{
assert(s);
StackExpansion(s);
s->array[s->size] = val;
s->size++;
}
void StackPushleft(ST* s, BTNode* root)
{
assert(s);
assert(root);
do {
StackPush(s, root);
} while (root = root->left);
}
BTNode* StackPop(ST* s)
{
s->size--;
return s->array[s->size];
}
int StackIsEmpty(ST* s)
{
return s->size == 0;
}
//二叉树部分
BTNode* BTBuyNode(BTDatatype val)
{
BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));
assert(newnode);
newnode->val = val;
newnode->left = newnode->right = NULL;
return newnode;
}
BTNode* BTCreat(const char* str, int* i)
{
assert(str);
assert(i);
if (str[*i] == '#'&&*i!=0)
{
(*i)++;
return NULL;
}
BTNode* root = BTBuyNode(str[(*i)++]);
root->left = BTCreat(str, i);
root->right = BTCreat(str, i);
return root;
}
void BTInorder(BTNode* root)
{
assert(root);
ST s;
StackInit(&s);
StackPushleft(&s,root);
while (!StackIsEmpty(&s))
{
BTNode* treenode = StackPop(&s);
printf("%c ", treenode->val);
if(treenode->right)
StackPushleft(&s, treenode->right);
}
}
int main()
{
const char*str = "ABD###CE##F##";
int i = 0;
BTNode* bt = BTCreat(str, &i);
BTInorder(bt);
return 0;
}