学习递归构造二叉树,并且进行前序遍历。
前序遍历,中序遍历和后序遍历是什么?
遍历的顺序分别如下:
- 前序遍历:根节点,左子树,右子树;
- 中序遍历:左子树,根节点,右子树;
- 后序遍历:左子树,右子树,根节点。
明眼人可能看出来了:这里的前中后指的是根节点的位置。
前序遍历是根节点在前,中序遍历指根节点在中间遍历,中序遍历又叫做“投影遍历”,顺序基本上没变。
递归生成树的代码:
//定义 结点结构体
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);//后序遍历打印
}
树的遍历结果:
可以看到:中序遍历是投影遍历,向下做一个投影。
本文简单记录了树的递归生成形式,以及主函数如何调用。
其次,本文记录了树递归形式的:前序遍历,中序遍历和后序遍历。
希望对你有帮助。
来源:CSDN
作者:shizheng_Li
链接:https://blog.csdn.net/shizheng_Li/article/details/104500422