二叉树的建立和三种遍历方式(递归)

本文介绍了如何使用递归方法建立二叉树,并详细讲解了先序、中序和后序三种遍历方式。通过示例代码展示了如何在C++中实现这些操作,包括创建节点、构建二叉树以及执行不同的遍历顺序。

二叉树的建立和遍历
例如 给出下图:
在这里插入图片描述
//先序是abd###c##
//#代表空节点
//先序(根左右),即先遍历根节点,再遍历左节点,直到最左节点为空,接着遍历右节点 。即abdc.
//中序(左根右),即先遍历左节点,直到遍历到最左,然后遍历根节点,最后再遍历右节点直到最右。即bdac.
//后序(左右根),即先遍历左节点,直到遍历到最左,然后遍历右节点,直到到最右,最后再遍历根节点。即dbca.
// 用先序的排列顺序来建立树:

#include <iostream>
#include<string.h>
#include<stdlib.h>

using namespace std;
typedef char Type ; //Type 代表char类型
#define END ‘#’ //END 代替 #

typedef struct Node 
{
     struct   Node *leftchild;  //左孩子节点指针
     struct   Node *rightchild; //右孩子节点指针
     Type data;   //数据域
}Node,*pNode; 

//创建节点
Node *SetNode()
{
Node *p = new Node; //创建一个Node对象
if( p == NULL)
{
exit(1);
}
memset(p,0,sizeof(Node)); //进行初始化
return p;
}
//创建二叉树
void Settree(pNode &ptr) //用引用来当形参 ,实际是形参当实参使用
{
Type tmp = 0;
cin>>tmp;
if(tmp != END) //当tmp不是#时
{
ptr = SetNode(); //创建一个节点 ptr指向它
ptr->data = tmp;
Settree(ptr->leftchild); //递归的找到左节点
Settree(ptr->rightchild); //递归的找到右节点
}
else //tmp 为#时
{
ptr = NULL;
}
}
//先序遍历
void PreOrder(pNode ptr)
{
if(ptr != NULL)
{
cout<< ptr ->data<< " “;
PreOrder(ptr->leftchild); //递归的遍历左孩子
PreOrder(ptr->rightchild); //递归的遍历右孩子
}
}
//中序遍历
void InOrder(pNode ptr)
{
if(ptr != NULL)
{
InOrder(ptr->leftchild);
cout<< ptr->data<<” ";
InOrder(ptr->rightchild);
}
}
//后序遍历
void PastOrder(pNode ptr)
{
if(ptr != NULL)
{
PastOrder(ptr->leftchild);
PastOrder(ptr->rightchild);
cout<< ptr->data<< " ";
}
}
int main()
{
Node *ptr =NULL; //指针要置空 不然会成为野指针
Settree(ptr);
cout<<“先序遍历为”<<endl;
PreOrder(ptr);
cout<<“中序遍历为”<<endl;
InOrder(ptr);
cout<<“后序遍历为”<<endl;
PastOrder(ptr);
return 0;
}
结果如下:
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值