大一计算机的自学总结:二叉树及其三种序的递归遍历

前言

二叉树(Binary Tree)是一种很常见的数据结构,其三种序的遍历也非常重要。

一、二叉树及其三种序

1.二叉树

顾名思义,就是每个根节点分出两个子节点的树结构。

大一计算机的自学总结:二叉树及其三种序的递归遍历_第1张图片

2.先序

按照“中、左、右”的顺序输出二叉树每个节点的值。

以上图的二叉树为例,先序遍历的结果为:1、2、4、5、3、6、7。

3.中序

按照“左、中、右”的顺序输出二叉树每个节点的值。

以上图的二叉树为例,中序遍历的结果为:4、2、5、1、6、3、7。

4.后序

按照“左、右、中”的顺序输出二叉树每个节点的值。

以上图的二叉树为例,后序遍历的结果为:4、5、2、6、7、3、1。

二、三种序的递归实现

如果用递归的方法遍历,整个代码会非常简便。关于递归的内容可以看我“初见递归”的文章。大一计算机的自学总结:初见递归

1.二叉树的创建

#include
using namespace std;

typedef struct TreeNode
{
	int value;
	TreeNode* left;
	TreeNode* right;
}TreeNode;

//创建二叉树 
void addTree(TreeNode* &head)
{
	int n;
	cin>>n;
	if(n!=-1)
	{
		TreeNode* p=(TreeNode*)malloc(sizeof(TreeNode));
		p->value=n;
		p->left=p->right=NULL;
		head=p;
		cout<<"node "<left);
		cout<<"node "<right);
	}
}

首先是树节点的定义,包括数值、指向左孩子的指针和指向右孩子的指针。

这里创建的方法同样使用了递归,首先输入n,以-1为结束的哨兵(sentinal),然后创建新节点,让head=p节点,然后分别对左孩子和右孩子进行递归。

需要注意,这里输入的顺序是先一直输入左孩子,然后再输入右孩子。

2.先序遍历

#include
#include"BinaryTree.h"
using namespace std;

//先序遍历 
void preOrder(TreeNode* head)
{
	if(head==NULL)
	{
		return;
	}
	
	cout<value<<" ";
	preOrder(head->left);
	preOrder(head->right);
}

int main()
{
	TreeNode* head=NULL;
	
	//创建二叉树 
	addTree(head);
	
	//先序遍历
	cout<<"preorder:"<

 根据“中、左、右”的顺序,先输出当前节点的值,然后对左孩子和右孩子调用函数。

3.中序遍历

#include
#include"BinaryTree.h"
using namespace std;

//中序遍历 
void inOrder(TreeNode* head)
{
	if(head==NULL)
	{
		return;
	}
	
	inOrder(head->left);	
	cout<value<<" ";
	inOrder(head->right);
}

int main()
{
	TreeNode* head=NULL;
	
	//创建二叉树 
	addTree(head);
	
	//中序遍历
	cout<<"inorder:"<

 根据“左、中、右”的顺序,先对左孩子调用函数,再输出当前节点的值,然后对右孩子调用函数。

4.后序遍历

#include
#include"BinaryTree.h"
using namespace std;

//后序遍历 
void postOrder(TreeNode* head)
{
	if(head==NULL)
	{
		return;
	}
	
	postOrder(head->left);	
	postOrder(head->right);	
	cout<value<<" ";
}

int main()
{
	TreeNode* head=NULL;
	
	//创建二叉树 
	addTree(head);
	
	//后序遍历
	cout<<"postorder:"<

 根据“左、右、中”的顺序,先对左孩子和右孩子调用函数,再输出当前节点的值。

总结

二叉树是非常重要的数据结构,递归的遍历方法对于简化遍历代码很重要,而之后非递归遍历的思路同样很重要。

END

你可能感兴趣的:(算法,数据结构,c++)