二叉树的建立及前序遍历 C++算法 leetcode144

本文深入探讨了二叉树的前序遍历算法,包括递归实现过程及代码示例。从二叉树的基本概念出发,详细解析了前序遍历的特点及其在计算机科学中的应用。

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

前文提要:

a.树里的每一个节点有一个根植和一个包含所有子节点的列表。从图的观点来看,树也可视为一个拥有N个节点N-1条边的一个有向无环图;

b.二叉树是每个节点最多有两个子树的树结构,通常子树被称作“左子树”和“右子树”;

c.二叉树的遍历是指从根结点触发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

题目:二叉树的前序遍历

给定一个二叉树,返回它的 前序 遍历。

 示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [1,2,3]

进阶: 递归算法很简单,你可以通过迭代算法完成吗?

解答:

①前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树;

②特点:a. 根----->左------->右;

              b. 根据前序遍历的结果可知第一个访问的必定是root结点。

 代码示例:

1.头文件

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef char ElemType;

2.创建二叉树结构

//二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(分别指向左右孩子)

typedef  struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

3. 二叉树建立

//二叉树的建立,按前序遍历的方式建立二叉树,当然也可以以中序或后序的方式建立二叉树
void CreateBiTree(BiTree *T)
{
	ElemType ch;
	cin >> ch;
	if (ch == '#')
		*T = NULL;  //保证是叶结点
	else
	{
		*T = (BiTree)malloc(sizeof(BiTNode));
		//if (!*T)
		//exit(OVERFLOW); //内存分配失败则退出。
		(*T)->data = ch;//生成结点
		CreateBiTree(&(*T)->lchild);//构造左子树
		CreateBiTree(&(*T)->rchild);//构造右子树    
	}
}

4.遍历二叉树——前序遍历

 

//表示对遍历到的结点数据进行的处理操作,此处操作是将树结点前序遍历输出
void operation1(ElemType ch)
{
	cout << ch << " ";
}
//此处在输出的基础上,并输出层数
void operation2(ElemType ch, int level)
{
	cout << ch << "在第" << level << "层" << endl;
}


//递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T, int level)
{
	if (T == NULL)
		return;
	/*此处表示对遍历的树结点进行的操作,根据你自己的要求进行操作,这里只是输出了结点的数据*/
	//operation1(T->data);
	operation2(T->data, level); //输出了层数

	PreOrderTraverse(T->lchild, level + 1);
	PreOrderTraverse(T->rchild, level + 1);
}

5.主函数

int main()
{
	int level = 1; //表示层数
	BiTree T = NULL;
	cout << "请以前序遍历的方式输入扩展二叉树:"; //类似输入AB#D##C##
	CreateBiTree(&T);// 建立二叉树,没有树,怎么遍历

	cout << "递归前序遍历输出为:" << endl;
	PreOrderTraverse(T, level);//进行前序遍历,其中operation1()和operation2()函数表示对遍历的结点数据进行的处理操作
	cout << endl;

	return 0;
}

程序测试结果: 

源代码:

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef char ElemType;

//二叉树的二叉链表结构,也就是二叉树的存储结构,1个数据域,2个指针域(分别指向左右孩子)

typedef  struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//二叉树的建立,按前序遍历的方式建立二叉树,当然也可以以中序或后序的方式建立二叉树
void CreateBiTree(BiTree *T)
{
	ElemType ch;
	cin >> ch;
	if (ch == '#')
		*T = NULL;  //保证是叶结点
	else
	{
		*T = (BiTree)malloc(sizeof(BiTNode));
		(*T)->data = ch;//生成结点
		CreateBiTree(&(*T)->lchild);//构造左子树
		CreateBiTree(&(*T)->rchild);//构造右子树    
	}
}
//表示对遍历到的结点数据进行的处理操作,此处操作是将树结点前序遍历输出
void operation1(ElemType ch)
{
	cout << ch << " ";
}
//此处在输出的基础上,并输出层数
void operation2(ElemType ch, int level)
{
	cout << ch << "在第" << level << "层" << endl;
}


//递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T, int level)
{
	if (T == NULL)
		return;
	/*此处表示对遍历的树结点进行的操作,根据你自己的要求进行操作,这里只是输出了结点的数据*/
	//operation1(T->data);
	operation2(T->data, level); //输出了层数

	PreOrderTraverse(T->lchild, level + 1);
	PreOrderTraverse(T->rchild, level + 1);
}


int main()
{
	int level = 1; //表示层数
	BiTree T = NULL;
	cout << "请以前序遍历的方式输入扩展二叉树:"; //类似输入AB#D##C##
	CreateBiTree(&T);// 建立二叉树,没有树,怎么遍历

	cout << "递归前序遍历输出为:" << endl;
	PreOrderTraverse(T, level);//进行前序遍历,其中operation1()和operation2()函数表示对遍历的结点数据进行的处理操作
	cout << endl;

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值