定义二叉树和栈结构体
//二叉树节点结构体
typedef struct TreeNode{
int data; //数据域
struct TreeNode *left,*right; //指针域
}TreeNode;
//栈的结构体
typedef struct Stack{
int top; //数据域
TreeNode* array[MAX_STACK_SIZE]; 指针域
}Stack;
栈的创建与操作
//栈的结构体
typedef struct Stack{
int top;
TreeNode* array[MAX_STACK_SIZE];
}Stack;
//创建一个新栈
Stack* createStack(){
Stack* stack=(Stack*)malloc(sizeof(Stack));
stack->top=-1;
return stack;
}
//判断栈是否为空
int isEmpty(Stack* stack)
{
return (stack->top==-1);
}
//入栈操作
void push(Stack* stack,TreeNode* item) {
if(stack->top==MAX_STACK_SIZE-1){
printf("栈满!\n");
return;
}
stack->array[++stack->top]=item;
}
//出栈操作
TreeNode* pop(Stack* stack)
{
if(isEmpty(stack)){
printf("栈空!\n");
exit(EXIT_FAILURE);
}
return stack->array[stack->top--];
}
创建一个新的二叉树节点
//创建一个新的二叉树节点
TreeNode* createNode(int data){
TreeNode* newNode=(TreeNode*)malloc(sizeof(TreeNode));
newNode->data=data;
newNode->left=NULL;
newNode->right=NULL;
return newNode;
}
中序遍历算法
//中序遍历二叉树
void inorderTraversal(TreeNode* root){
if(root==NULL) return;
Stack* stack=createStack();
TreeNode* current=root;
while (current!=NULL||!isEmpty(stack)){
while(current!=NULL){
push(stack,current);
current=current->left;
}
current=pop(stack);
printf("%d",current->data);
current=current->right;
}
}
代码汇总
#include<stdio.h>
#include<stdlib.h>
#define MAX_STACK_SIZE 100
//二叉树节点结构体
typedef struct TreeNode{
int data;
struct TreeNode *left,*right;
}TreeNode;
//栈的结构体
typedef struct Stack{
int top;
TreeNode* array[MAX_STACK_SIZE];
}Stack;
//创建一个新栈
Stack* createStack(){
Stack* stack=(Stack*)malloc(sizeof(Stack));
stack->top=-1;
return stack;
}
//判断栈是否为空
int isEmpty(Stack* stack)
{
return (stack->top==-1);
}
//入栈操作
void push(Stack* stack,TreeNode* item) {
if(stack->top==MAX_STACK_SIZE-1){
printf("栈满!\n");
return;
}
stack->array[++stack->top]=item;
}
//出栈操作
TreeNode* pop(Stack* stack)
{
if(isEmpty(stack)){
printf("栈空!\n");
exit(EXIT_FAILURE);
}
return stack->array[stack->top--];
}
//创建一个新的二叉树节点
TreeNode* createNode(int data){
TreeNode* newNode=(TreeNode*)malloc(sizeof(TreeNode));
newNode->data=data;
newNode->left=NULL;
newNode->right=NULL;
return newNode;
}
//中序遍历二叉树
void inorderTraversal(TreeNode* root){
if(root==NULL) return;
Stack* stack=createStack();
TreeNode* current=root;
while (current!=NULL||!isEmpty(stack)){
while(current!=NULL){
push(stack,current);
current=current->left;
}
current=pop(stack);
printf("%d",current->data);
current=current->right;
}
}
int main(){
TreeNode* root=createNode(1);
root->left=createNode(2);
root->right=createNode(3);
root->left->left=createNode(4);
root->left->right=createNode(5);
printf("Inorder traversal of the binary tree is: ");
inorderTraversal(root);
printf("\n");
return 0;
}
总结:先序遍历,中序遍历以及后续遍历三者大题思路是一样的,只不过是cout的顺序不一样。