文章目录

  • 1. 非递归:快速排序 汉诺塔
    • 1.1 快速排序非递归
    • 1.2 汉诺塔非递归
  • 2. 判断完全二叉树
  • 3. 二叉链表交换左右孩子
    • 3.1 递归
    • 3.1 非递归
  • 4. 01背包问题

1. 非递归:快速排序 汉诺塔

非递归思想启发博文:https://blog.csdn.net/bobbypollo/article/details/79891556
快速排序的学习博文:https://blog.csdn.net/qq_36528114/article/details/78667034

1的重点为二者的非递归,代码中的递归主要是在理解二者非递归思想时用于对比

递归的重要的一点就是必须先解决子问题,再基于子问题来解决当前问题。
即先进后出,
故递归转非递归时用来解决。

1.1 快速排序非递归

//快速排序递归非递归对比
#include <iostream>
#include <stack>
using namespace std;//快速排序
template <class T>
int Particition(T* pa, int low, int high)
{int i = low, j = high;T temp = pa[i];while (i != j){while (i<j && pa[j]>temp)j--;if (i < j)pa[i++] = pa[j];while (i < j && pa[i] < temp)i++;if (i < j)pa[j--] = pa[i];}pa[i] = temp;return i;
}
//快速排序递归算法
void QuickSoret(T* pa, int low, int high)
{if (low > high)return;int m = Particition(pa, low, high);QuickSoret(pa, low, m - 1);QuickSoret(pa, m + 1, high);
}
//快速排序非递归算法
template <class T>
void QuickSoret2(T* pa, int low, int high)
{T i,j;stack<T> S;if (low > high)return;int m;S.push(low);S.push(high);while (!S.empty()){j = S.top();S.pop();i = S.top();S.pop();m = Particition(pa, i, j);if (m - 1 > i){S.push(i);S.push(m-1);}if (m + 1 < j){S.push(m+1);S.push(j);}}
}
//附加验证
template<class T>
void PrintQuickSoretResout(T* pa, int low, int high)
{QuickSoret2(pa, low, high);for (int k = low; k <= high; k++)cout << pa[k] << "  ";cout << endl;
}
int main()
{int paa[10] = { 2,3,6,1,4,5,9,8,7,10 };PrintQuickSoretResout(paa, 0, 9);
}

1.2 汉诺塔非递归

这里写的汉诺塔非递归比较局限,只考虑3根柱子A, B, C,且只有A上有 n 个环,要求全移到 C 上。
其他的情况还在探讨中
非递归思想和上面 快速排序非递归 的思想一样

//汉诺塔递归非递归对比算法
#include <iostream>
#include <stack>
using namespace std;//汉诺塔递归算法
void Hanoi(int n, char A, char B, char C)
{if (n <= 0)return;if (n > 1)Hanoi(n - 1, A, C, B);cout << '(' << n << ")," << A << ',' << C << endl;if (n > 1)Hanoi(n - 1, B, A, C);
}
// 汉诺塔非递归算法
void Hanoi2(int n, char A, char B, char C)
{if (n <= 0)return;char a, b, c;stack<char> S;S.push(A);S.push(B);S.push(C);while (!S.empty()){c = S.top();S.pop();b = S.top();S.pop();a = S.top();S.pop();cout << '(' << n-1 << ")," << a << ',' << c << endl;if (n - 1 > 1){S.push(a);S.push(c);S.push(b);n--;}}
}
//附加验证
int main()
{char E = 'A', F = 'B', G = 'C';Hanoi(3, E, F, G);cout << endl;return 0;
}

2. 判断完全二叉树

每个节点有四种情况,根据完全二叉树定义进行 标记或判断
该博文思路相同,讲解详细:https://blog.csdn.net/qq_40938077/article/details/80471997

bool isCBTtree(const BTnode<T>* t)
{if (t == NULL) //空树是完全二叉树return true;queue<const BTnode<T>*> Q;Q.push(t);bool tag = false;while (!Q.empty()){t = Q.front();Q.pop();if ((tag && (t->left!=NULL || t->right != NULL)) || (t->left == NULL && t->right != NULL))return false;if(t->left)Q.push(t->left);if(t->right)Q.push(t->right);if(!t->right)tag=true;}return true;
}

3. 二叉链表交换左右孩子

3.1 递归

template <class T>
void ChangLR1(BTnode<T>* t)
{if (t->left == NULL && t->right == NULL)return;BTnode<T>* temp;temp = t->left;t->left = t->right;t->right = temp;if (t->left)ChangLR1(t->left);if (t->right)ChangLR1(t->right);cout << endl;
}

3.1 非递归

template <class T>
void ChangLR2(BTnode<T>* t)
{if (t == NULL)return;queue <BTnode<T>*> Q;Q.push(t);BTnode<T>* temp;while (!Q.empty()){t = Q.front();Q.pop();temp = t->left;t->left = t->right;t->right = temp;if (t->left)Q.push(t->left);if (t->right)Q.push(t->right);}cout << endl;
}

4. 01背包问题

关于01背包问题,有一篇博文讲的非常妙,看完后把表手动打一遍理解更深刻:https://blog.csdn.net/qq_38410730/article/details/81667885

下面的代码其实还可以模块化,有机会继续改善

#include <iostream>
#include <algorithm>
using namespace std;int item[5] ;
int w[5] = { 0,2,3,4,5 };
int v[5] = { 0,3,4,5,6 };
int dp[5][9] = { {0} };
int Vbag = 8;void xuanzhe()
{int i, j;for(i=1;i<=4;i++)for (j = 1; j <= Vbag; j++){if (j >= w[i]){dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - w[i]] + v[i] );//item[i] = 1;}else{dp[i][j] = dp[i - 1][j];//item[i] = 0;}}
}void dabiao()
{int i, j;for (i = 0; i <= 4; i++){ for (j = 0; j <=8; j++)cout << dp[i][j] << "  ";cout << endl;}cout << endl;for (i = 1; i <= 4; i++)cout << item[i] << "  ";cout << endl;
}void zhaoduilie(int i,int j)
{if(i >= 0 ){if (dp[i][j] == dp[i - 1][j]){item[i] = 0;zhaoduilie(i - 1,j);}if (j - w[i] >= 0 && dp[i][j] == dp[i - 1][j - w[i]] + v[i]){item[i] = 1;zhaoduilie(i - 1,j-w[i]);}}
}int main()
{xuanzhe();zhaoduilie(4,8);dabiao();
}

【数据结构】二叉树题目代码总结 (快速排序与汉诺塔的非递归 、判断完全二叉树 、二叉链表交换左右孩子 、01背包问题)相关推荐

  1. 7-5 汉诺塔的非递归实现 (25 分)

    7-5 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b ...

  2. 汉诺塔的非递归实现(借助堆栈模拟递归)

    汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...

  3. PTA 汉诺塔的非递归实现

    PTA 汉诺塔的非递归实现 7-11 汉诺塔的非递归实现 (25分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过 ...

  4. 7-107 汉诺塔的非递归实现 (25 分)

    7-107 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为" ...

  5. 7-17 汉诺塔的非递归实现 (25 分)(思路分析)

    一:题目 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标柱(标记 ...

  6. 习题3.10 汉诺塔的非递归实现 (25分)

    借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标柱(标记为&quo ...

  7. 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  8. 汉诺塔问题的递归和非递归算法

    汉诺塔问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 ...

  9. 汉诺塔问题的递归求解

    汉诺塔问题的递归求解 汉诺塔 解题思路 具体实现 汉诺塔 汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱 ...

  10. 汉诺塔问题c++递归解法

    ​汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆 ...

最新文章

  1. 碾压ES和MongoDB,RedisJson横空出世!
  2. rommon模式下给路由器灌入IOS
  3. ORACLE RAC 11.2.0.4 for RHEL6.8 集群CRS异常导致集群命令无法使用
  4. 使用Qt开发中国象棋(一):概述
  5. PP物料主数据中MRP相关配置字段理解
  6. 【论文阅读-Bidding】《Feedback Control of Real-Time Display Advertising》
  7. JAVA 框架-Spring-AOP面向切面
  8. 2020年软考信息安全工程师考试学习资料包
  9. dom4j解析xml_JAVADom、Sax解析XML详解
  10. this conn php,测试connect.php文件出现问题
  11. xpraid安装_在Win2003/XP安装光盘中集成RAID驱动 不用软驱装RAID/SATA/SAS驱动
  12. Flux、Mono、Reactor 实战(史上最全)
  13. 软件评测师题库--操作系统基础知识
  14. C语言求1到100的和
  15. 玩转SQLite4:SQLite数据插入与查看
  16. 安装cnpm后运行报cnpm :无法加载文件 C:\Users\29038\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本。
  17. 12、FPGA程序的固化和下载
  18. Fatal: Failed to start mining: etherbase missing: etherbase must be explicitly specified
  19. 华为0510 实习笔试
  20. 适合医院、诊所、乡镇卫生院使用的门诊管理系统

热门文章

  1. 计算机无法连接到桌面,Win7系统桌面天气小工具提示解决方案无法连接到服务...
  2. ASCII码(C语言)
  3. WinHex18.4算法分析
  4. Sublime Text 2 注册码/破解方法
  5. 怎么搭建三合一源码优惠券网站步骤教程
  6. Modbus RTU/ASCll+TCP+OPC电脑模拟+串口调试软件对接方案
  7. 横向对比EXT4,带你感受真实的Linux文件系统F2FS
  8. ubuntu截图工具KSnapshot(静态图),peek(动态图)
  9. 从BIM行业看中国工业软件的困境及出路
  10. 同济版《线性代数》再遭口诛笔伐,网友:它真的不太行