[数据结构]二叉树的中序遍历

本文详细介绍了二叉树节点和栈的结构体,包括栈的创建、操作方法,以及如何使用栈实现二叉树的中序遍历。展示了创建新节点、栈的入栈出栈操作以及一个简单的二叉树实例的中序遍历过程。
摘要由CSDN通过智能技术生成

 定义二叉树和栈结构体

//二叉树节点结构体 
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的顺序不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值