数据结构二叉树训练题目——二叉树三叉链表表示

3 篇文章 1 订阅
2 篇文章 0 订阅

二叉树三叉链表表示

哈喽,大家好,我是赏月君,今天做二叉树三叉链表表示,废话少说,上题目。
题目描述
给定有根二叉树T,请编写一个程序,输出其各结点u的如下信息。

  • u的结点编号
  • u的深度
  • u的父结点
  • u的高
  • u的兄弟结点
  • 结点的种类(根、内部结点、叶)
  • u的子结点数
    设给定二叉树拥有n个结点,编号分别为0至n-1。
    输入
    输入第1行输人结点的个数n。 接下来n行按照下述格式输人各结点的信息,每个结点占1行。
    id left right
    id为结点编号,lefi 为左子结点编号, right 为右子结点编号。不存在子结点时lefit (right)为- 1。
    输出
    输出按照下述格式输出结点信息。
    node id: parent = p, sibling = s, degree = deg, depth = dep, height = h, type
    其中p表示父结点的编号,父结点不存在时记作-1。s表示兄弟结点的编号,兄弟结点不存在时记作- 1。
    deg、dep、h分别表示子结点数、深度、高。type表示结点的类型,从root (根)、intermal node (内部结点) 、leaf (叶)三个字符串中选择其一。
    请仔细阅读输出示例,注意空格等输出格式。
    限制
    1≤n≤ 25
    输入示例
    在这里插入图片描述
    样例输入
9
0 1 4
1 2 3
2 -1 -1
3 -1 -1
4 5 8
5 6 7
6 -1 -1
7 -1 -1
8 -1 -1

样例输出

node 0: parent = -1, sibling = -1, degree = 2, depth = 0, height = 3, root
node 1: parent = 0, sibling = 4, degree = 2, depth = 1, height = 1, internal node
node 2: parent = 1, sibling = 3, degree = 0, depth = 2, height = 0, leaf
node 3: parent = 1, sibling = 2, degree = 0, depth = 2, height = 0, leaf
node 4: parent = 0, sibling = 1, degree = 2, depth = 1, height = 2, internal node
node 5: parent = 4, sibling = 8, degree = 2, depth = 2, height = 1, internal node
node 6: parent = 5, sibling = 7, degree = 0, depth = 3, height = 0, leaf
node 7: parent = 5, sibling = 6, degree = 0, depth = 3, height = 0, leaf
node 8: parent = 4, sibling = 5, degree = 0, depth = 2, height = 0, leaf

题目思路
写几个函数实现求深度、高度、兄弟结点和打印相关语句。

C++代码实现

#include<bits/stdc++.h>
using namespace std;
struct Node{int parent,left,right;};//定义结构体
Node T[25];
int n,D[25],H[25];
//深度
void setDepth(int u,int d){
	if(u==-1)return;
	D[u]=d;
	setDepth(T[u].left,d+1);
	setDepth(T[u].right,d+1);
}
//高度
int setHeight(int u){
	int h1=0,h2=0;
	if(T[u].left!=-1)h1=setHeight(T[u].left)+1;
	if(T[u].right!=-1)h2=setHeight(T[u].right)+1;
	return H[u]=(h1>h2?h1:h2);
}
//兄弟结点
int getSibling(int u){
	if(T[u].parent==-1)return -1;
	if(T[T[u].parent].left!=u&&T[T[u].parent].left!=-1)return T[T[u].parent].left; 
	if(T[T[u].parent].right!=u&&T[T[u].parent].right!=-1)return T[T[u].parent].right;
	return -1;
}
//打印函数
void print(int u){
	printf("node %d: ",u);
	printf("parent = %d, ",T[u].parent);
	printf("sibling = %d, ",getSibling(u));
	int deg=0;
	if(T[u].left!=-1)deg++;
	if(T[u].right!=-1)deg++;
	printf("degree = %d, ",deg);
	printf("depth = %d, ",D[u]);
	printf("height = %d, ",H[u]);
	if(T[u].parent==-1)printf("root\n");
	else if(T[u].left==-1&&T[u].right==-1)printf("leaf\n");
	else printf("internal node\n");
}
int main(){
	int v,l,r,root=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++)T[i].parent=-1;
	for(int i=0;i<n;i++){
		scanf("%d%d%d",&v,&l,&r);
		T[v].left=l;
		T[v].right=r;
		if(l!=-1)T[l].parent=v;
		if(r!=-1)T[r].parent=v;
	}
	for(int i=0;i<n;i++)if(T[i].parent==-1)root=i;
	setDepth(root,0);
	setHeight(root);
	for(int i=0;i<n;i++)print(i);
}

OK,解决了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值