递归构造二叉树和二叉树的遍历

时光总嘲笑我的痴心妄想 提交于 2020-02-25 19:25:01

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

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

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

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

递归生成树的代码:

//定义 结点结构体
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);//后序遍历打印

}


树的遍历结果:
在这里插入图片描述

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

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

希望对你有帮助。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!