您的位置:首页 > 编程语言 > C语言/C++

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

2013-11-28 10:08 274 查看
/* 邵发, 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 ++;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: