学习递归构造二叉树,并且进行前序遍历。

前序遍历,中序遍历和后序遍历是什么?
遍历的顺序分别如下:

  • 前序遍历:根节点,左子树,右子树;
  • 中序遍历:左子树,根节点,右子树;
  • 后序遍历:左子树,右子树,根节点

明眼人可能看出来了:这里的前中后指的是根节点的位置
前序遍历是根节点在前,中序遍历指根节点在中间遍历,中序遍历又叫做“投影遍历”,顺序基本上没变。

递归生成树的代码:

//定义 结点结构体
struct tnode {T data;tnode<T>* left;tnode<T>* right;tnode<T>* parent;
};//递归生成树的函数
//返回指向根节点的指针
double alpha;//根节点的比例
template <typename iterator>//迭代器类型
iterator tree_generation(iterator start, size_t n)
{if (n < 1)return NULL;size_t c = (n - 1)*alpha;//根相对位置iterator root = start + c;//根节点的位置iterator left_subtree = tree_generation(start, c);//左子树的树根iterator right_subtree = tree_generation(start + c + 1, n - 1 - c);//右子树的树根root->left = left_subtree;//根节点的左儿子root->right = right_subtree;//根节点的右儿子if (left_subtree != NULL)//左子树的父亲left_subtree->parent = root;if (right_subtree != NULL)//右子树的父亲right_subtree->parent = root;return root;
}

递归前序遍历的代码:

//前序遍历
template<typename iterator>void pre_order(iterator p)
{if (p != NULL){cout << p->data << ' ';//根节点,这里做打印处理pre_order(p->left);//遍历左子树pre_order(p->right);//遍历右子树}
}

中序遍历的代码:

//中序遍历
template<typename iterator>void in_order(iterator p)
{if (p != NULL){in_order(p->left);//左子树cout << p->data << ' ';//根节点in_order(p->right);//右子树}
}

后序遍历的代码:

//后序遍历
template<typename iterator>void back_order(iterator p)
{if (p != NULL){back_order(p->left);//左子树back_order(p->right);//右子树cout << p->data << ' ';//根节点}
}

全部代码:

// binary_tree.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include "pch.h"
#include <iostream>
#include<vector>using namespace std;
//template<typename iterator>
template<typename T>
//树的结点
struct tnode {T data;tnode<T>* left;tnode<T>* right;tnode<T>* parent;
};//递归生成树
double alpha;
template <typename iterator>
iterator tree_generation(iterator start, size_t n)
{if (n < 1)return NULL;size_t c = (n - 1)*alpha;//根相对位置iterator root = start + c;//根节点的位置iterator left_subtree = tree_generation(start, c);//左子树的树根iterator right_subtree = tree_generation(start + c + 1, n - 1 - c);//右子树的树根root->left = left_subtree;root->right = right_subtree;if (left_subtree != NULL)left_subtree->parent = root;if (right_subtree != NULL)right_subtree->parent = root;return root;
}//前序遍历
template<typename iterator>void pre_order(iterator p)
{if (p != NULL){cout << p->data << ' ';pre_order(p->left);pre_order(p->right);}
}//中序遍历
template<typename iterator>void in_order(iterator p)
{if (p != NULL){in_order(p->left);//左子树cout << p->data << ' ';//根节点in_order(p->right);//右子树}
}//后序遍历
template<typename iterator>void back_order(iterator p)
{if (p != NULL){back_order(p->left);//左子树back_order(p->right);//右子树cout << p->data << ' ';//根节点}
}int main()
{std::cout << "Hello World!\n"; size_t n;cout << "请输入元素个数:" <<  endl;cin >> n;if (n < 1)return 0;vector<tnode<size_t>> tree(n);for (size_t i = 0; i < tree.size(); ++i)tree[i].data = i;//赋值alpha = 0.3;//比例auto root = tree_generation(&tree[0], tree.size());//生成树root->parent = NULL;//树根的处理cout << "树中的元素有:" << endl;for (const auto &x : tree)cout << x.data << ' ';cout << endl << endl;cout << "前序遍历的结果为:" << endl;pre_order(root);//前序遍历打印cout << endl << endl;cout << "中序遍历的结果为:" << endl;in_order(root);//中序遍历打印cout << endl << endl;cout << "后序遍历的结果为:" << endl;back_order(root);//后序遍历打印}

树的遍历结果:

可以看到:中序遍历是投影遍历,向下做一个投影。

本文简单记录了树的递归生成形式,以及主函数如何调用。
其次,本文记录了树递归形式的:前序遍历,中序遍历和后序遍历。

希望对你有帮助。

递归构造二叉树和二叉树的遍历相关推荐

  1. 二叉树 —— 创建二叉树 先序遍历 、中序遍历、后序遍历(递归方式、非递归方式)

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char DataType; #de ...

  2. linux 递归创建线程,[linux]二叉树的建立及其递归遍历(C语言实现)

    #二叉树的特点: 每一个节点最多有两棵子树,所以二叉树中不存在度大于2的节点,注意,是最多有两棵,没有也是可以的 左子树和右子树是有顺序的,次序不能颠倒,这点可以在哈夫曼编码中体现, 顺序不同编码方式 ...

  3. 二叉树的三种遍历(递归,栈)

    二叉树的先序遍历 数据访问顺序:根结点------->左孩子------->又孩子 使用递归 使用了分治法:将一个大树向下一层层的分为多个小子树 /*** 先序遍历,使用递归,输出树中所有 ...

  4. 数据结构(3) 第三天 栈的应用:就近匹配/中缀表达式转后缀表达式 、树/二叉树的概念、二叉树的递归与非递归遍历(DLR LDR LRD)、递归求叶子节点数目/二叉树高度/二叉树拷贝和释放...

    01 上节课回顾 受限的线性表 栈和队列的链式存储其实就是链表 但是不能任意操作 所以叫受限的线性表 02 栈的应用_就近匹配 案例1就近匹配: #include <stdio.h> in ...

  5. 算法基础11 —— 树入门(二叉树的遍历以及构造 + 普通树转换成二叉树 + 例题 + 二叉树的一些操作)

    字符二叉树的遍历 对于以上二叉树 先序遍历为(根左右) : ABCDEFG 中序遍历为(左根右) : CBEDAFG 后序遍历为(左右根) : CEDBGFA 层序遍历:(从左往右.从上往下) ABF ...

  6. 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现

    二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现 提示:今天开始,系列二叉树的重磅基础知识和大厂高频面试题就要出炉了,咱们慢慢捋清楚! 文章目录 二叉树,二叉树的归先序遍历,中序遍历, ...

  7. 二叉树的先序遍历(非递归)

    虽然递归简单理解,但是用递归内存开销大,耗时长,性能往往不如非递归方式 所以这里通过栈,用非递归方法实现二叉树的先序遍历 二叉树的存储结构定义: typedef struct node{int dat ...

  8. 二叉树的四种遍历方式(递归和非递归双重实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  9. 数据结构与算法 | 二叉树四种的遍历方法(递归与非递归)

    二叉树的遍历是指从根节点出发,按照某种次序依次访问二叉树的所有节点,使得每个节点被访问且只访问一次. 而一般有四种遍历方法: 前序.中序.后序.层序,下面就分别讲一下四个遍历的思路以及代码实现 例如我 ...

最新文章

  1. 数据结构遍历顺序栈_链栈的初始化与遍历
  2. 【Python相关】Vaex :突破pandas,快速分析100GB大数据集
  3. 树莓派1 安装使用 ZeroTier
  4. java切面获取reqiest,怎么在webflux切面中获取请求头.
  5. 展望二十一世纪第三个十年
  6. SparkStreaming - 窗口函数(窗口操作)
  7. Mongoose多数据库连接及实用样例
  8. MongoDB的选举过程
  9. c语言编fft算法程序,用C语言实现FFT算法
  10. 【金九银十】Java微服务面试题,看到你就是赚到
  11. matlab节约里程法_节约里程法matlab.doc
  12. 阿里云企业邮箱POP3、SMTP和IMAP服务器地址和端口号对照表
  13. 尼康1c全站仪语言设置,尼康NIVO.1C全站仪
  14. python 趋势跟踪算法_DualThrust区间突破策略Python版
  15. 远程登陆速达E3PRO服务器出现share violation错误的解决方法.
  16. 基于飞浆ERNIE3.0百亿级大模型实现中文短文本分类任务
  17. html中frame背景颜色,如何修改frame窗口的背景颜色?
  18. [生存志] 第38节 平王东周都洛阳
  19. 《漂浮城堡历险记》的云端之旅
  20. Java程序员的认证Sun Certified JAVA Programmer(SCJP)

热门文章

  1. 【转】Xcode7.1环境下上架iOS App到AppStore 流程 (Part 二)
  2. 代码坏味道 - 耦合
  3. Android之动态改变控件大小
  4. 借助传感器用计算机测速度实验题,专家分析2015年高考命题趋势 内容设计将再创新...
  5. cad绘制椭圆的方法有几种_你还在头疼CAD系统变量如何设置?这些你知道几个吗?...
  6. 用径向函数和球谐函数计算氢原子能级并验证维里定理
  7. 用神经网络做分子动力模拟 二氟甲烷,二氯甲烷,二溴甲烷并计算键值
  8. mvc @html.checkbox,MVC - @Html.CheckBoxFor
  9. Ardino基础教程 14_倾斜开关
  10. PCB走线拐弯处锯齿显示与平滑显示