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 ++; } } }
相关文章推荐
- C++作业:n只猴子围成一圈,顺时针方向从1到n编号
- C++作业: 五人合伙夜间捕鱼,天亮前因劳累在河边相继分别找地方睡去
- 关于初始化C++类成员
- new一个类对象和使用类名创建一个对象有什么区别?
- C++函数的返回值——返回引用类型&非引用类型
- C++作业03_02: 下楼问题。从楼上走到楼下共有h个台阶,每一步有三种走法
- C++作业03_01: 将写的n封信和n个信封全部装错。设Dn为n封信装错信封可能的种类
- C++作业02_02: 4 名专家对 4 款赛车进行评论
- C++作业02_01: 新浪微博的消息 ID ( MID ) 有字符型和数字型两种形态,可以互相转换
- C++作业01_02:100元钱,由2元、1元、5角三种面额组成,且一共有100张,试打印出各种组合
- C++作业 01_01: 读入一个整数,将各位数上的数拆下来并输出
- vc++窗口的创建过程(MFC消息机制的经典文章)
- C语言学习中自己经验总结
- VC++中的DDX和DDV
- VC++之使用CFile类操作文件
- test1-1(谨以此开始我的c++之旅)
- Visual c++例子,可不使用常规的对话框资源模板的情况下,动态创建对话框的方法
- C与C++风格字符串
- Socket的正确关闭
- 对话框的建立(模态与非模态)