题目需求描述:
编写一个程序,实现二叉树的基本运算,具体要求如下:(指定示范实例1:P243图7.34。指定示范实例2:P201图7.13 )
1,括号表示法输出该树。
2,输入一个结点的值,输出该结点的左,右孩子的值。(要能测试错误数据)
3,输出该二叉树的高度。
4,输出该二叉树结点的个数。
5,输出该二叉树双分支结点的个数。
6,输出该二叉树单分支结点的个数。
7,输出该二叉树叶子结点的个数。
8,输出该二叉树的宽度。(宽度为每层结点数的最大值)
9,(选做题)任意给定该二叉树的两个结点,输出它们的最近的公共祖先。(例:对P243图7.34,输入J, N,它们的祖先是H,E,B,A,最近的祖先是H。 另外一组测试数据为:L,E的公共祖先是:E。 )
10,销毁该二叉树。
二叉树的操作集
1.头文件
#include<iostream>
#include<string>
using namespace std;
const int N = 50;
typedef char ElemType;
2.二叉树结构体定义:BTNode
//二叉树结构体
typedef struct node {
ElemType data; //数据域
struct node* lchild; //左孩子
struct node* rchild; //右孩子
}BTNode;
3. 通过括号表达式创建二叉树:CreateBTree(b,str)
//.创建二叉树
void CreateBTree(BTNode*& b, char* str)
{
BTNode* St[N], * p; //St数组充当栈
int top = -1, k, j = 0; //top为栈顶指针,j为遍历的数据下标,k用来标记是左儿子还是右儿子
char ch; //标记当前遍历到的字符
b = NULL; //初始为空
ch = str[j];
while (ch != '\0'){
switch(ch){
case '(':top++; St[top] = p; k = 1; break;
case ')':top--; break;
case ',': k = 2; break;
default:p = (BTNode*)malloc(sizeof(BTNode));
p->data = ch;
p->lchild = p->rchild = NULL;
if (b == NULL)b = p;
else {
switch (k){
case 1:St[top]->lchild = p; break;
case 2:St[top]->rchild = p; break;
}
}
}
j++;
ch = str[j];
}
}
4. 查找左右孩子:LchildNode(p) RchildNode(p)
//.输入一个结点的值,输出该结点的左,右孩子的值(配合查找结点函数使用)
BTNode* LchildNode(BTNode*p)
{
return p->lchild;
}
BTNode* RchildNode(BTNode* p)
{
return p->rchild;
}
5.二叉树高度 :HightBTree(b)
//.输出该二叉树的高度
int HightBTree(BTNode* b)
{
int l, r;
if (b == NULL)return 0;
else {
l = HightBTree(b->lchild);
r = HightBTree(b->rchild);
return max(l + 1, r + 1);
}
}
6.二叉树结点的个数:CountBTNode(b)
//.输出该二叉树结点的个数
int CountBTNode(BTNode* b)
{
int cnt = 0;
if (b == NULL)return 0;
else {
cnt += CountBTNode(b->lchild) + 1;
cnt += CountBTNode(b->rchild) + 1;
}
return cnt;
}
7.双分支结点的个数: DoubleBTNode(b)
//.输出该二叉树双分支结点的个数
int DoubleBTNode(BTNode* b)
{
if (b == NULL)return 0;
else if (b->lchild && b->rchild)
return DoubleBTNode(b->lchild) + DoubleBTNode(b->rchild) + 1;
else
return DoubleBTNode(b->lchild) + DoubleBTNode(b->rchild);
}
8.单分支结点的个数:OneBTNode(b)
//.输出该二叉树单分支结点的个数。
int OneBTNode(BTNode* b)
{
if (b == NULL)return 0;
else if (b->lchild && !b->rchild)
return OneBTNode(b->lchild) + 1;
else if (b->rchild && !b->lchild)
return OneBTNode(b->lchild) + 1;
else
return OneBTNode(b->lchild) + OneBTNode(b->rchild);
}
9.叶子结点的个数: ElemBTNode(b)
//.输出该二叉树叶子结点的个数。
int ElemBTNode(BTNode* b)
{
if (b == NULL)return 0;
else if (!b->lchild && !b->rchild)
return 1;
else
return ElemBTNode(b->lchild) + ElemBTNode(b->rchild);
}
10.二叉树的宽度: widthBTree(b)
//.输出该二叉树的宽度
int widthBTree(BTNode* b)
{
if (b == NULL) return 0;
int maxwidth = 0;
if (!b->lchild && !b->rchild)
return 1;
else
maxwidth = max(widthBTree(b->lchild) + widthBTree(b->rchild), maxwidth);
return maxwidth;
}
11. 查找结点:FindBTree(b,e)
//.查找结点,返回其地址
BTNode* FindBTree(BTNode* b, ElemType e) //函数返回类型为BTNode* 类型的指针
{
BTNode* p;
if (b == NULL)
return NULL;
else if (b->data == e)
return b;
else {
p = FindBTree(b->lchild, e);
if (p != NULL)
return p;
else
return FindBTree(b->rchild, e);
}
}
12. 输出二叉树:DispBTree(b)
//.输出二叉树
void DispBTree(BTNode* b)
{
if (b != NULL)
{
cout << b->data;
if (b->lchild!=NULL || b->rchild!=NULL)
{
cout << '(';
DispBTree(b->lchild);
if (b->rchild!=NULL)cout << ',';
DispBTree(b->rchild);
cout << ')';
}
}
}
13.销毁二叉树:DestroyBTree(b)
//销毁二叉树
void DestroyBTree(BTNode*& b)
{
if (b != NULL)
{
DestroyBTree(b->lchild); //递归左子树
DestroyBTree(b->rchild); //递归右子树
free(b);
}
}
14.寻找最近祖先:getfather_Node(b,p,q)
//任意给定该二叉树的两个结点,输出它们的最近的公共祖先。
BTNode * getfather_Node(BTNode *b, ElemType p,ElemType q)
{
if (b == NULL||b->data==p||b->data==q)return b;
BTNode *left = getfather_Node(b->lchild,p,q);
BTNode *right = getfather_Node(b->rchild,p,q);
if(left==NULL&&right==NULL)
return NULL;
else if(left==NULL)
return right;
else if(right==NULL)
return left;
else
return b;
}