C++作业:将左右孩子互换 / 复制一棵二叉树

/* 邵发, 1309班,  */

/*
12周作业

练习1:编写递归算法、将左右孩子互换 (用递归)
练习2:编写复制一棵二叉树 (不用递归)

*/

#include <stdio.h>

// 定义节点
struct Node
{
	int value;
	Node* left, *right;
};

// 练习1:交换左右孩子节点
void SwapChildren(Node* tree)
{
	if(!tree) return;
	
	Node* t = tree->left;
	tree->left = tree->right;
	tree->right = t;

	SwapChildren(tree->left);
	SwapChildren(tree->right);
}

// 练习2:复制一棵二叉树

// 递归版本
// 也可以把引用改成**,不过可读性会差一些
void Copy_r(Node* oldtree, Node* &newtree)
{
	// 空节点
	if(oldtree == NULL)
	{
		newtree = NULL;
	}
	else
	{
		// 附加节点
		newtree = new Node();
		// 拷贝节点的值
		newtree->value = oldtree->value;

		// 递归拷贝子节点
		Copy_r(oldtree->left, newtree->left);
		Copy_r(oldtree->right,newtree->right);
	}
}

// 非递归版本 (直接由递归版本改造, 由自定义栈替换递归逻辑)
void Copy_nr(Node* oldtree, Node** newtree)
{
	Node*  stack_old[256];
	Node** stack_new[256];  // 注意这里存放的是**
	int top = 0; // 顶点位置,同时也是栈的元素个数

	// 推入根节点
	stack_old[top] = oldtree;
	stack_new[top] = newtree;
	top ++;

	while(top > 0)
	{
		// 取节点复制
		top--; // 先减再取
		Node** pNew = stack_new[top];
		Node*  pOld = stack_old[top];
		//top --;

		// 复制, 跟前面copy_r实际上相同
		// 使用引用来去掉一个*,否则可读性欠佳
		Node*& p = *pNew;
		if(pOld == NULL)
		{
			p = NULL;
		}
		else
		{
			// 复制本节点
			p = new Node();
			p->value = pOld->value;

			// 再复制子节点, 相当于递归调用
			stack_new[top] = & (p->left);
			stack_old[top] = pOld->left;
			top ++;

			stack_new[top] = & (p->right);
			stack_old[top] = pOld->right;
			top ++;
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值