目录
前言
定义二叉树
二叉树的创建
二叉树的遍历
1.基于先序遍历建立输出二叉树的先序遍历序列
2.基于先序遍历建立输出二叉树的中序遍历序列
3.基于先序遍历创建输出二叉树的后序遍历序列
统计利用先序遍历创建的二叉树的深度
统计利用先序遍历创建的二叉树的宽度
统计利用先序遍历创建的二叉树叶结点的个数
统计利用先序遍历创建的二叉树的度为2的结点个数
统计利用先序遍历创建的二叉树的度为1的结点个数
统计利用先序遍历创建的二叉树中的空链域个数
二叉树有三种遍历方式:先序遍历、中序遍历和后序遍历。
不妨我们现在规定:在任何的遍历方式中,我们都让左子树先于右子树遍历。这样就可以使得遍历方式由6种变为我们规定的以上三种。用N表示根节点的话,这三种遍历方式可以分表示为:NLR,LNR,LRN。
typedef struct Node
{
char data;//数据域
Node *Lchild, *Rchild;//定义左右孩子节点
} BT;
void pre_order_creater(BT *&Root)
{
char ch;
cin >> ch;
if (ch == '#')
Root = NULL;
else
{
Root = (Node *)malloc(sizeof(Node));
Root->data = ch;
pre_order_creater(Root->Lchild);//先递归创建左子树
pre_order_creater(Root->Rchild);//再递归创建右子树
}
}
建立二叉树建议用先序遍历哟~其余两种在此处不做说明了~
void Pre_Order(BT *&Root)
{
if (Root != NULL)
{
cout << Root->data;//先输出当前节点
Pre_Order(Root->Lchild);//然后遍历左子树
Pre_Order(Root->Rchild);//最后遍历右子树
}
}
void Pre_Order(BT *&Root)
{
if (Root != NULL)
{
Pre_Order(Root->Lchild); //先遍历左子树
cout << Root->data; //然后输出当前节点
Pre_Order(Root->Rchild); //最后遍历右子树
}
}
void Pre_Order(BT *&Root)
{
if (Root != NULL)
{
Pre_Order(Root->Lchild); //先遍历左子树
Pre_Order(Root->Rchild); //然后遍历右子树
cout << Root->data; //最后输出当前节点
}
}
显然,采取的遍历方式不同,输出的结果也会收到影响。A题时一定要注意题目要求!!
int tree_deep(BT *&Root)
{
if (Root == NULL)
return 0; //如果该节点为空链域,则返回0
else
return 1 + max(tree_deep(Root->Lchild), tree_deep(Root->Rchild)); //否则便1加上左右子树深度最大的那个
}
int maxn = 0, bucket[1005]; //定义全局变量
void Width(BT *&Root, int i)
{
if (Root != NULL)
{
bucket[i]++;
maxn = max(maxn, bucket[i]);
Width(Root->Lchild, i + 1);
Width(Root->Rchild, i + 1);
}
}
int Num(BT *&Root)
{
if (Root == NULL)
return 0;
else if (!Root->Lchild && !Root->Rchild)
return 1;
else
return Num(Root->Rchild) + Num(Root->Lchild);
}
int sum = 0; //定义全局变量
void Num(BT *&Root)
{
if (Root != NULL)
{
if (Root->Lchild && Root->Rchild) sum++;
Num(Root->Lchild);
Num(Root->Rchild);
}
}
int sum = 0; //定义全局变量
void Num(BT *&Root)
{
if (Root != NULL)
{
if (Root->Lchild && !Root->Rchild) sum++;
else if (!Root->Lchild && Root->Rchild) sum++;
Num(Root->Lchild);
Num(Root->Rchild);
}
}
int Num(BT *&Root)
{
if (Root == NULL)
return 1;
else
return Num(Root->Lchild) + Num(Root->Rchild);
}
树有许多的东西,本来想再写一下前天学的二叉树与树,森林的转换,但是奈何电脑要没有电了(呜呜呜!),这是一个自己的笔记,后续会陆续进行添加(例如红黑树,哈夫曼树什么的~),修改,有兴趣的可以收藏一下~