二叉树交换相关算法题|递归/非递归交换所有节点左右子树(C)

交换左右子树

设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有节点的左右子树进行交换的函数

算法思想

采用递归算法实现交换二叉树的左右子树,首先交换root节点左孩子的左右子树,然后交换root节点右孩子的左右子树,最后交换root节点的左右孩子,当节点为空时递归结束(后序遍历思想)

void swap(BTNode root)
{
	if (root)
	{
		swap(root->left);
		swap(root->right);
		temp = root->left;
		root->left = root->right;
		root->left = temp;
	}
}

非递归交换左右子树

算法思想
  • 初始化栈:将根节点入栈。
  • 遍历节点:
    • 弹出栈顶节点。
    • 交换该节点的左右子树。
    • 将右子树(若存在)入栈。
    • 将左子树(若存在)入栈。
  • 结束条件:栈为空,遍历结束。
  • 结果:树的所有节点的左右子树被交换。
// 定义二叉树节点 
typedef struct BTNode 
{ 
	int data; 
	struct BTNode* left; 
	struct BTNode* right; 
} BTNode;

// 交换左右子树 
void SwapChildren(BTNode* node) 
{ 
	BTNode* temp = node->left; 
	node->left = node->right; 
	node->right = temp; 
}

// 辅助函数:创建新节点 
BTNode* CreateNode(int data) 
{ 
	BTNode* newNode = (BTNode*)malloc(sizeof(BTNode)); 
	newNode->data = data; 
	newNode->left = NULL; 
	newNode->right = NULL; 
	return newNode; 
} 

// 辅助函数:中序遍历 
void InOrderTraversal(BTNode* root) 
{ 
	if (root == NULL) 
		return; 
		
	InOrderTraversal(root->left); 
	printf("%d ", root->data); 
	InOrderTraversal(root->right); 
}

// 非递归交换二叉树所有节点的左右子树 
void SwapBinaryTree(BTNode* root) 
{ 
	if (root == NULL) 
		return; 
	
	StackNode* stack = NULL; 
	Push(&stack, root); 
	
	while (!IsEmpty(stack)) 
	{ 
		BTNode* current = Pop(&stack); 
		// 交换当前节点的左右子树 
		SwapChildren(current); 
		// 如果右子树存在,入栈 
		if (current->right) 
		{ 
			Push(&stack, current->right); 
		} 
		// 如果左子树存在,入栈 
		if (current->left) 
		{ 
			Push(&stack, current->left); 
		} 
	} 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值