二叉树的建立和遍历
例如 给出下图:

//先序是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;
}
结果如下:

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

被折叠的 条评论
为什么被折叠?



