二叉树的构建和四种遍历方式的代码实现

本文详细介绍了如何使用C++构建二叉树,并实现前序、中序、后序及层次遍历。通过递归与队列,文章展示了二叉树节点的插入过程与遍历算法,为读者提供了深入理解二叉树结构的机会。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

// Tree.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <queue>
#include<stdlib.h>
using namespace std;
typedef struct BiNode
{
	int data;
	BiNode *Lchil;
	BiNode *Rchil;
}BiNode, *BiTree;

bool FindEnd(BiTree root, int num, BiTree upon, BiTree &p)
{
	//root是定位到的节点,等待判定是否是可插入节点,若是,放入p位置 
	//此函数用于定位可插入的节点的位置,放在p里边,p是实参 
	// num是要插入的值,在此进行比较找出可插入节点的位置 
	//upon是p的父亲节点的位置 ,初始时传入的值为NULL,因为根没有父亲节点 
	if (root == NULL)
	{
		p = upon;
		//若此时探测到的root是空节点,则说明upon为合适的可插入节点,返回false 
		return false;
	}
	else if (root->data == num)
	{
		p = upon;
		//若探测到数据的值出现在root中,则不用插入了 ,将p定位到上一个节点中 
		return true;
	}
	else if (num < root->data)
	{
		return FindEnd(root->Lchil, num, root, p);
		//若小于,则往root的左孩子进行探测,同时root作为上一节点赋给upon 
	}
	else if (num > root->data)
	{
		return FindEnd(root->Rchil, num, root, p);
		//若大于,则往root的右孩子进行探测,同时root作为上一节点赋给upon 
	}
}

void AddNode(BiTree &root, int num)
{
	BiTree p;
	//p用于定位输入数据后该数据可以添加在的节点的位置
	//这个节点一定不是中间节点,其左右一定至少有一边可以添加数据 
	BiTree newp;
	//newp是为这个输入数据所创建的节点 
	if (FindEnd(root, num, NULL, p) != true)
		//如果判定所输入的数据在此二叉树中的确不存在,则执行以下操作 
	{
		newp = (BiTree)malloc(sizeof(BiNode));
		newp->data = num;
		newp->Lchil = NULL;
		newp->Rchil = NULL;
		//创建newp节点,把输入的那个数据的值赋给它的data 
		if (p == NULL)
			//p==NULL说明这个树是空的,之前没有任何数据输入 
		{
			root = newp;
			//那么新节点newp就放在根的位置
		}
		else if (num < p->data)
		{
			p->Lchil = newp;
			//如果输入数据比p节点的数据小,放在左孩子 
		}
		else if (num > p->data)
		{
			p->Rchil = newp;
			//如果输入数据比p节点数据大,放在右孩子 
		}
	}
	//如果判定存在,不执行插入操作 
}

void PreOrder(BiTree root)
//前序遍历函数,当此节点非空的时候才可以打印数据 
{
	if (root)
	{
		cout << root->data << " ";
		PreOrder(root->Lchil);
		PreOrder(root->Rchil);
	}
}

void InOrder(BiTree root)
//中序遍历函数,当此节点非空的时候才可以打印数据
{
	if (root)
	{
		InOrder(root->Lchil);
		cout << root->data << " ";
		InOrder(root->Rchil);
	}
}

void PostOrder(BiTree root)
//后序遍历函数,当此节点非空的时候才可以打印数据
{
	if (root)
	{
		PostOrder(root->Lchil);
		PostOrder(root->Rchil);
		cout << root->data << " ";
	}
}
//层次遍历
void LevelOrder(BiTree root)
{
	queue<BiNode *> q;//定义队列
	
	if (!root) return;
	q.push(root);//将根节点入队
	while (q.empty() == false)//只要队列不空,就继续循环下去
	{
		BiNode *temp = q.front();//定义临时变量存储队列的头节点
		q.pop();
		if (temp->Lchil)//如果队列的头结点的左孩子存在,就让它入队
		{
			q.push(temp->Lchil);
		}
		if (temp->Rchil)//如果队列的头结点的右孩子存在,就让它入队
		{
			q.push(temp->Rchil);
		}
		//由于队列先进先出的特性,新加入的节点会排列在队列后,对头元素仍然是之前的节点,从而实现了层序遍历
		cout << temp->data << " ";//对于自己,打印输出
	}
}
int main()
{
	int n;
	while (cin >> n)
		//保证可以重复输入执行 
	{
		BiTree root = NULL;
		//先创建一个节点作为根节点 
		for (int i = 0;i<n;i++)
		{
			int num;
			cin >> num;
			AddNode(root, num);
			//往根节点里边添加数,共添加n个  
		}
		PreOrder(root);
		//前序遍历 
		cout << endl;
		InOrder(root);
		//中序遍历 
		cout << endl;
		PostOrder(root);
		//后序遍历 
		cout << endl;
		LevelOrder(root);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值