/* 邵发, 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 ++;
}
}
}