二叉树代码练习

本文介绍了一个使用C语言实现的二叉树结构及其基本操作,包括创建、前序、中序和后序遍历等,并通过栈实现了中序遍历。此外,还提供了计算树高度的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define STACK_SIZE 100

typedef struct TREE
{
	char data;
	struct TREE *left;
	struct TREE *right;
}*Tree,Node;

typedef struct STACK
{
	Node node[STACK_SIZE];
	int top;
}Stack;

void init_stack(Stack * stack)
{
	stack->top = 0;
}

int is_empty(Stack *stack)
{
	return stack->top == 0;
}

int push(Stack *stack,Node * node)
{
	if(stack->top == STACK_SIZE)
		return 0;

	stack->node[stack->top++] = *node;
	return 1;
}

int top(Stack *stack,Node *node)
{
	if(stack->top == 0)
		return 0;

	*node = stack->node[stack->top-1];
	return 1;
}

int pop(Stack *stack,Node *node)
{
	if(stack->top == 0)
		return 0;

	*node = stack->node[--stack->top];
	return 1;
}

void creat_tree(Tree * tree)
{
	char data[1];
	scanf("%s",data);

//	char data;
//	scanf("%c",data); //会把回车当输入!why?

	if(data[0] == 'a')
	{
		*tree = NULL;
	}
	else
	{
		*tree = malloc(sizeof(Node));
		if(*tree == NULL)
		{
			exit(0);
		}
			
		(*tree)->data = data[0];
		creat_tree(&((*tree)->left));
		creat_tree(&((*tree)->right));
	}
	return ;
}

void pre_order(Tree tree)
{
	if(tree == NULL)
		return ;
	
	printf("%c",tree->data);
	pre_order(tree->left);
	pre_order(tree->right);
}

void in_order(Tree tree)
{
	if(tree == NULL)
		return ;
	
	in_order(tree->left);
	printf("%c",tree->data);
	in_order(tree->right);
}

void post_order(Tree tree)
{
	if(tree == NULL)
		return ;
	
	post_order(tree->left);
	post_order(tree->right);
	printf("%c",tree->data);
}

void in_order_stack(Tree tree)
{
	if(tree == NULL)
		return ;

	Stack stack;
	init_stack(&stack);

	Node * node = malloc(sizeof(Node));

	while(!is_empty(&stack) || tree)
	{
		if(tree != NULL)
		{
			push(&stack,tree);
			tree = tree->left;
		}
		else
		{
			pop(&stack,node);
			printf("%c ",node->data);
			if(node->right != NULL)
				tree = node->right;
		}
	}
	printf("\n");
}

int tree_heigh(Tree tree)
{
	if(tree == NULL)
		return 0;
	else
	{
	       int left = tree_heigh(tree->left);
	       int right = tree_heigh(tree->right);
	       return left > right ? left+1 : right+1;
	}
}

// 1 2 3 a 4 a a a a
//     1
//   2   3
// a  4 a  a
//   a a
int main()
{
	Tree tree = NULL;
	creat_tree(&tree);
	printf("pre:\n");
	pre_order(tree);
	printf("\nin:\n");
	in_order(tree);
	printf("\npost:\n");
	post_order(tree);
	printf("\n");
	printf("Tree heigh is %d\n",tree_heigh(tree));

	in_order_stack(tree);

	return 0;
}

在C++中,二叉树是一种常用的数据结构,它由节点组成,每个节点最多有两个子节点,通常被称为左孩子和右孩子。以下是一个简单的二叉搜索树的节点和基本操作(插入、查找和删除)的代码示例: ```cpp #include <iostream> using namespace std; // 定义二叉树节点 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 插入操作 TreeNode* insert(TreeNode* root, int val) { if (!root) return new TreeNode(val); if (val < root->val) root->left = insert(root->left, val); else root->right = insert(root->right, val); return root; } // 查找操作 bool search(TreeNode* root, int val) { if (!root || root->val == val) return root ? true : false; return val < root->val ? search(root->left, val) : search(root->right, val); } // 删除操作(这里仅演示了简单情况下的删除,实际情况要考虑更复杂的情况) TreeNode* remove(TreeNode* root, int val) { if (!root) return nullptr; if (val < root->val) root->left = remove(root->left, val); else if (val > root->val) root->right = remove(root->right, val); else { // 找到要删除的节点 if (!root->left && !root->right) return nullptr; // 没有子节点直接删除 if (!root->left) return root->right; // 只有右子节点,将右子节点替换根节点 if (!root->right) return root->left; // 只有左子节点,将左子节点替换根节点 TreeNode* temp = findMin(root->right); // 寻找右子树最小节点 root->val = temp->val; // 替换值 root->right = remove(root->right, temp->val); // 递归删除右子树中的最小节点 } return root; } // 找到最小节点 TreeNode* findMin(TreeNode* node) { while (node->left) node = node->left; return node; } int main() { TreeNode* root = nullptr; // 使用insert方法构建二叉搜索树 // ... // 示例操作 if (search(root, 5)) cout << "找到5" << endl; root = remove(root, 4); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值