题目:
(1)利用二叉树字符串“A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建二叉树的二叉链式存储结构;
(2)输出该二叉树;
(3)输出‘H’节点的左、右孩子结点值;
(4)输出该二叉树的结点个数、叶子结点个数、二叉树的度和高度;
思路:
(1) 以输入’#’作为二叉树节点终止符,利用递归实现二叉树的各个节点的创建。
(2) 利用前序遍历递归算法输出二叉树。
(3) 利用递归寻找是否有节点与H相匹配,一旦匹配,输出其左右孩子的节点值
,若不匹配则递归寻找。
(4) 结点个数:利用整型cnt初始化为0来作为函数引用参数计数,利用类似前序遍历的递归算法,找到一个不为NULL的结点,则cnt+1;
叶子结点:利用整型cnt初始化为0来作为函数引用参数计数,利用类似前序遍历的递归算法,若该结点左右子树均为NULL,则cnt+1;
二叉树的度:该值只有可能为0,1,2,所以利用cnt计数和似前序遍历的递归算法,如果cnt==2,则可以直接返回,无需再查找,若为1,或0,则继续查找,cnt以总取较大值即可;
二叉树的深度:对每一条路径进行深度搜索,如果某个结点为叶子结点,则该层深度为1,叶子结点的上一层则取其左右子树深度的较大值+1,以此类推,最终得出首根结点的值即为二叉树的深度。
代码块:
#include "pch.h"
#include <iostream>
using namespace std;
struct Btree
{
char data;
Btree *lchild;
Btree *rchild;
};
void create(Btree*&root)//创建二叉树
{
char data;
cin >> data;
root = new Btree;
if (data != '#')//如果不是为终止符号
{
root->data = data;//设置数据
cout << "请输入"<<data<<"的左子树:\n"; create(root->lchild);//建立该结点左子树
cout << "请输入"<<data<<"的右子树:\n"; create(root->rchild);//建立该结点右子树
}
else root = NULL;
}
void preorder(Btree*&root)//前序遍历
{
cout << root->data << "\t";
if (root!=NULL)
{
if (root->lchild)preorder(root->lchild);
if (root->rchild)preorder(root->rchild);
}
}
bool search(Btree*root, char data)//搜索特定节点的左右孩子
{
if (root == NULL) return false;
if (root->data == data)//如果结点是寻找结点,输出左右子树
{
cout << root->data << "的左子树是:" << root->lchild->data<<endl;
cout << root->data << ",的右子树是:" << root->rchild->data<<endl;
return true;
}
else {//否则,继续寻找该结点
return search(root->lchild, data)||search(root->rchild, data);
}
}
void nodenum(Btree *root, int &cnt)//结点数量
{
if (root != NULL)//结点不为空
{
cnt++;//结点数量加1
nodenum(root->lchild, cnt);//继续遍历寻找
nodenum(root->rchild, cnt);
}
}
void leavenode(Btree*root, int &cnt)//叶子结点数量
{
if (root != NULL&&root->lchild == NULL&&root->rchild == NULL)cnt++;//如果是叶子结点,数量加1
else if(root!=NULL)
{//否则往下寻找叶子结点
leavenode(root->lchild, cnt);
leavenode(root->rchild, cnt);
}
}
int depth(Btree *&tree)//计算二叉树深度
{
if (tree == NULL) return 0;//如果为空指针,返回0
else
{
int m = depth(tree->lchild) + 1;//计算左子树到该点的最大深度
int n = depth(tree->rchild) + 1;//计算右子树到该点的最大深度
if (m >= n) return m;//比较两深度大小,取较大
else return n;
}
}
void waynum(Btree*&tree, int &cnt)//计算二叉树的度
{
if (cnt == 2) return;//如果等于2,而可以返回
else if (tree != NULL && tree->lchild&&tree->rchild) {
cnt = 2; return;
}
else if (tree->lchild || tree->rchild)
{
cnt = cnt > 1 ? cnt : 1;//如果该结点只有左右子树之一,取较大值
if (tree->lchild) waynum(tree->lchild, cnt);
if (tree->rchild) waynum(tree->rchild, cnt);
}
else {
cnt = 0; return;
}
}
int main()
{
cout << "请输入树的根结点:";
Btree*tree=new Btree;
create(tree);
cout << "该树的前序遍历为:"<<endl;
preorder(tree);
cout << endl;
if(!search(tree, 'H')) cout<<"该结点不存在"<<endl;
int cnt=0;
nodenum(tree,cnt);
cout << "该树的结点个数为:" << cnt << endl;
cnt = 0;
leavenode(tree, cnt);
cout << "该树的叶子结点个数为:" << cnt << endl;
cnt = 0;
waynum(tree, cnt);
cout << "该二叉树的度为:" << cnt << endl;
cout<<"该二叉树的深度为:"<<depth(tree)<<endl;
}
输入的二叉树:
效果图: