目录
操作部分
1.二叉树链式存储的结构体定义
2.询问法创建二叉树
3.补空法创建二叉树
4.访问结点
5.先序遍历二叉树(根左右)
6.中序遍历二叉树(左根右)
7.后序遍历二叉树(左右根)
8.层序遍历二叉树(按照层次从左到右依次遍历)
代码部分
//二叉树的链式存储
//核心:n个结点的二叉链表共有n+1个空链域
/**/
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
typedef char ElemType;
//1.结构体定义
typedef struct Bnode {
ElemType data;
struct Bnode* lchild, * rchild, * parent;//左孩子指针,右孩子指针,双亲指针
}Bnode, * Btree;
//2.(询问法)创建二叉树
void CreateBtree_ask(Btree& T) {
char check;
T = (Bnode*)malloc(sizeof(Bnode));
cout << "请输入结点信息:" << endl;
cin >> T->data;
cout<<"是否添加"<<T->data<<"的左孩子?(Y / N)"<<endl;
cin >> check;
if (check == 'Y')
CreateBtree_ask(T->lchild);
else
T->lchild = NULL;
cout << "是否添加" << T->data << "的右孩子?(Y / N)" << endl;
cin >> check;
if (check == 'Y')
CreateBtree_ask(T->rchild);
else
T->rchild = NULL;
}
//3.(补空法)创建二叉树
//补空法是指如果左子树或右子树为空时,则用特殊字符补空,如“#”,
//然后按照根,左子树,右子树的顺序,得到先序遍历序列,根据该序列递归创建二叉树
//算法步骤:(1)输入补空后的二叉树先序遍历序列
// (2)如果ch="#",T=NULL;否则创建一个新节点T,令T->data=ch;递归创建T的左子树,递归创建T的右子树
void CreateBtree_fill(Btree &T) {
//例ABD##E##CF#G###
char ch;
cin >> ch;
if (ch == '#')
T = NULL;
else {
T = new Bnode; //生成根结点
T->data = ch;
CreateBtree_fill(T->lchild); //递归生成左子树
CreateBtree_fill(T->rchild); //递归生成右子树
}
}
//4.访问结点
void Visit(Btree T)
{
cout << T->data <<endl;
}
//5.先序遍历---根左右
void PreOrder(Btree T) {
if (T != NULL) {
Visit(T); //遍历根结点
PreOrder(T->lchild); //遍历左孩子
PreOrder(T->rchild); //遍历左孩子
}
}
//6.中序遍历---左根右
void InOrder(Btree T) {
if (T != NULL) {
InOrder(T->lchild); //遍历左孩子
Visit(T); //遍历根结点
InOrder(T->rchild); //遍历右孩子
}
}
//7.后序遍历---左右根
void PostOrder(Btree T) {
if (T != NULL) {
PostOrder(T->lchild); //遍历左孩子
PostOrder(T->rchild); //遍历右孩子
Visit(T); //遍历根结点
}
}
//8.层序遍历:按照层次从左到右依次遍历
//算法思想:
//1.初始化一个辅助队列
//2.根节点入队
//3.若队列非空,则队头结点出队,访问该结点,并将该结点的孩子从左到右依次入队(如果有的话)
//4.循环2,3直到队空
bool LevelTraverse(Btree T) {
Btree p;
if (!T)
return false;
queue<Btree>Q;
Q.push(T);
while (!Q.empty()) {
p = Q.front();
Q.pop();
cout << p->data << " ";
if (p->lchild)
Q.push(p->lchild);//左孩子指针入队
if (p->rchild)
Q.push(p->rchild);//右孩子指针入队
}
return true;
}
int main() {
Btree T;
//询问法创建二叉树
//CreateBtree_ask(T);
//补空法创建二叉树
cout << "请输入二叉树:" << endl;
CreateBtree_fill(T); //输入:ABD##E##CF#G###
//先序遍历
cout << "先序遍历的结果为:" << endl;
PreOrder(T);
//中序遍历
cout << "中序遍历的结果为:" << endl;
InOrder(T);
//后序遍历
cout << "后序遍历的结果为:" << endl;
PostOrder(T);
//层序遍历
cout<< "层序遍历的结果为:" << endl;
LevelTraverse(T);
}
运行部分
补空法创建二叉树
补空法算法思想:
补空法是指如果左子树或右子树为空时,则用特殊字符补空,如“#”,然后按照根,左子树,右子树的顺序,得到先序遍历序列,根据该序列递归创建二叉树
算法步骤:(1)输入补空后的二叉树先序遍历序列
(2)如果ch="#",T=NULL;否则创建一个新节点T,令T->data=ch;递归创建T的左子树,递归创建T的右子树
询问法创建二叉树
下面是该树的形状