数据结构作业:二叉树的基本操作一:(包括查找最近祖先问题)

该文描述了一个C++程序,用于处理二叉树的各种操作,包括括号表示法输出、查找节点及孩子节点、计算树的高度、节点数量、双分支节点、单分支节点、叶子节点数量以及宽度。此外,还包括了销毁二叉树的功能,并提供了寻找最近公共祖先的选做题。
摘要由CSDN通过智能技术生成

题目需求描述:

 编写一个程序,实现二叉树的基本运算,具体要求如下:(指定示范实例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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值