假设以二叉链作为存储结构,设计一个算法,输出每个叶子结点的所有祖先结点。并给出下图的二叉树的求解结果。采用先序遍历的递归方法和采用层次遍历方法分别求解。

【考研】东北大学二叉树相关算法(1) 序遍历二叉树线索化的递归算法 void InThread(ThreadTree &P,ThreadTree &pre) { if(p!=null) { InThread(p->lchild,pre); if(lchild==null) { p->lchild=pre; p->lta 阅读详情

//BTree.cpp
#include <stdio.h>
#include "BTree.h"
void ancestor1(BTNode *bt,ElemType path[],int pathlen)
{	int i;
	if (bt!=NULL)
	{	if (bt->lchild==NULL && bt->rchild==NULL)	//*bt为叶子结点
		{	printf("  %c结点的所有祖先结点: ",bt->data);
			for (i=pathlen-1;i>=0;i--)
				printf("%c ",path[i]);
			printf("\n");
		}
		else
		{	path[pathlen]=bt->data;					//将当前结点放入路径中
			pathlen++;								//path中元素个数增1
			ancestor1(bt->lchild,path,pathlen);	//递归扫描左子树
			ancestor1(bt->rchild,path,pathlen);	//递归扫描右子树
		}
	}
}
void ancestor2(BTNode *bt)
{
	BTNode *p;
	int i;
	struct 
	{	BTNode *s;					//存放结点指针
		int parent;					//存放其双亲结点在qu中的下标
	} qu[MaxSize];					//qu存放队中元素
	int front=-1,rear=-1;			//队头队尾指针
	rear++;
	qu[rear].s=bt;					//根结点进队
	qu[rear].parent=-1;				//根结点没有双亲,其parent置为-1
	while (front!=rear)				//队不空循环
	{
		front++;
		p=qu[front].s;				//出队一个结点*p,它在qu中的下标为front
		if (p->lchild==NULL && p->rchild==NULL)	//若*p为叶子结点
		{	printf("  %c结点的所有祖先结点: ",p->data);
			i=qu[front].parent;
			while (i!=-1)
			{
				printf("%c ",qu[i].s->data);
				i=qu[i].parent;
			}
			printf("\n");
		}
		if (p->lchild!=NULL)		//*p有左孩子,将左孩子进队
		{
			rear++;
			qu[rear].s=p->lchild;
			qu[rear].parent=front;	//左孩子的双亲为qu[front]结点
		}
		if (p->rchild!=NULL)		//*p有右孩子,将右孩子进队
		{
			rear++;
			qu[rear].s=p->rchild;
			qu[rear].parent=front;	//右孩子的双亲为qu[front]结点
		}
	}
}
int main()
{	BTNode *bt;
	ElemType path[MaxSize];
	CreateBTree(bt,"A(B(D,E(G,H)),C(,F(I)))");//建立图的二叉链
	printf("bt括号表示法:"); DispBTree(bt); printf("\n");
	printf("先序遍历的递归方法:\n");
	printf("输出每个叶结点的所有祖先结点:\n");
	ancestor1(bt,path,0);
	printf("层次遍历方法:\n");
	printf("输出每个叶结点的所有祖先结点:\n");
	ancestor2(bt);
}
//BTree.h
#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct tnode
{	ElemType data;					//数据域
	struct tnode *lchild,*rchild;	//指针域
} BTNode;

void CreateBTree(BTNode * &bt,char *str)
{	BTNode *St[MaxSize],*p=NULL;
	int top=-1,k,j=0;
	char ch;
	bt=NULL;			//建立的二叉树初始时为空
	ch=str[j];
	while (ch!='\0')	//str未扫描完时循环
	{	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 (bt==NULL)					//*p为二叉树的根结点
					bt=p;
				else							//已建立二叉树根结点
				{	switch(k) 
					{
					case 1:St[top]->lchild=p;break;
					case 2:St[top]->rchild=p;break;
					}
				}
		}
		j++;
		ch=str[j];
	}
}
void DestroyBTree(BTNode *&bt)
{	if (bt!=NULL)
	{	DestroyBTree(bt->lchild);
		DestroyBTree(bt->rchild);
		free(bt);
	}
}
int BTHeight(BTNode *bt) 
{	int lchilddep,rchilddep;
	if (bt==NULL) return(0); 			//空树的高度为0
	else
	{	lchilddep=BTHeight(bt->lchild);	//求左子树的高度为lchilddep
		rchilddep=BTHeight(bt->rchild);	//求右子树的高度为rchilddep
		return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
	}
}
int NodeCount(BTNode *bt)			//求二叉树bt的结点个数
{	int num1,num2;
	if (bt==NULL)					//空树返回0
		return 0;
	else
	{	num1=NodeCount(bt->lchild);	//求左子树结点个数
		num2=NodeCount(bt->rchild);	//求右子树结点个数
		return (num1+num2+1);		//返回和加上1
	}
}
int LeafCount(BTNode *bt)				//求二叉树bt的叶子结点个数
{	int num1,num2;
	if (bt==NULL)						//空树返回0
		return 0;
	else if (bt->lchild==NULL && bt->rchild==NULL) 
		return 1;						//叶子结点时返回1
	else
	{	num1=LeafCount(bt->lchild);		//求左子树叶子结点个数
		num2=LeafCount(bt->rchild); 	//求右子树叶子结点个数
		return (num1+num2);				//返回和
	}
}
void DispBTree(BTNode *bt) 
{	if (bt!=NULL)
	{	printf("%c",bt->data);
		if (bt->lchild!=NULL || bt->rchild!=NULL)
		{	printf("(");			//有子树时输入'('
			DispBTree(bt->lchild);	//递归处理左子树
			if (bt->rchild!=NULL)	//有右子树时输入'.'
				printf(",");
			DispBTree(bt->rchild);	//递归处理右子树
			printf(")");			//子树输出完毕,再输入一个')'
		}
	}
}

输出结果:

王道课后代码大题---树与二叉树 一.二叉树的概念 1.求两结点的最近公共祖先结点二叉树任意两个结点必然存在最近的公共祖先结点) 已知一颗二叉树顺序存储结构进行存储,设计一个算法,求编号分别为ij的两个结点的最近公共祖先结点 方法一 思想 最坏的情况是最近公共祖先结点为根节点,而且从最近的公共祖先结点到根节点的全部祖先结点都是公共的。由二叉树顺序存储的性质可知,任意结点i的双亲结点的编号为i/2,求解ij最近公共祖先结点算法步骤如下(设从数组下标1开始存储) (1)若i>j,则结点i所在层次大于等于结点j所在层次。结 阅读详情

相关推荐

二叉链表为存储结构, 试编写计算二叉树叶子结点数目的递归算法.

原题:以二叉链表为存储结构, 试编写计算二叉树叶子结点数目的递归算法.(该算法由下面程序中的LeafCount()函数实现) #include #include #define ElemType char #define NodeNum 5 using namespace std; //二叉树的双链表存储结构 typedef struct BiTNode { ElemTy

愿君出走半生,归来时仍是少年 3万+

输出叶子结点

6-11输出叶结点(15分) 本题要求按照序遍历顺序输出给定二叉树叶结点。 函数接口定义: void PreorderPrintLeaves( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; stru...

bahuan1974的博客 856

决策变量乘积项的线性化

介绍了决策变量相乘情况下的线性化,用案例进行线性化演示,其中针对连续变量相乘的情况介绍了McCormick包络的近似线性化方法

Linshaodan520的博客 1797

6-11 输出叶结点 (15分)(超简单分析)

本题要求按照序遍历顺序输出给定二叉树叶结点。 函数接口定义: void PreorderPrintLeaves( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数PreorderPrintLeaves应按照序遍历顺序输出给定二叉树B

xxxibgdrgn博客 2187

4-13 输出叶结点 (10 分)

本题要求按照序遍历顺序输出给定二叉树叶结点。 函数接口定义: void PreorderPrintLeaves( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Lef...

qq_43429341的博客 662

【每日一题之】输出二叉树

其中BinTree函数应按照序遍历顺序输出给定二叉树BT的叶结点,格式为一个空格跟着一个字符。

m0_62965246的博客 864

数据结构遍历二叉树递归递归遍历序、中序序遍历层次遍历法)

二叉树 递归递归遍历序、中序序遍历层次遍历

ChenZHIHAO_y的博客 1943

二叉树结点的路径

南昌航空大学实验报告 课程名称: 数据结构A 实验名称: 实验六 二叉树及其应用 (一) 班 级: XXX 学生姓名: XXX 学号: XXXXX 指导教师评定: XXX 签 名: XXX 一、实验目的 树形结构是一类重要的非线性数据结构,树中结点之间具有明确的层次关系。本实验是有关二叉树存储结构及其遍历的应用。 二、实验内容 在实验中,...

qq_45767547的博客 5829

数据结构二叉树存储结构/中/后序递归遍历算法(C语言)

目录1. 树与二叉树1.1 树的基本概念1.2 二叉树的基本概念2. 二叉树存储结构遍历算法2.1 二叉树存储结构2.2 二叉树的前中后序遍历2.3 遍历算法的应用2.4 完整实现代码2.5 运行结果3. 遍历算法基于栈的递归消除 1. 树与二叉树 1.1 树的基本概念 树是 n(n>=0)个结点的有限集合 T。当 n = 0 时,称为空树;当 n>0 时,该集合满足: ① 其中必有一个称为根(root)的特定结点,它没有直接前驱,但有零个或多个直接后驱。 ② 其余 n-1 个结点可以划分

weixin_51450101的博客 4878

数据结构-二叉树-假设二叉树采用二叉链存储结构设计一个算法输出值为x的结点的所有祖先。(递归&非递归

这里采用序遍历创建二叉树,可以使用ABD#G###CE##F## 来进行实验 #include<stdio.h> #include<stdlib.h> #define MaxSize 100; #define STACK_INIT_SIZE 100 //2.假设二叉树采用二叉链存储结构设计一个算法输出值为x的结点的所有祖先。 typedef struct BiTNode { char data; struct BiTNode* lchild; s

h420405961的博客 5018

数据结构实验——exp4--二叉树实验

一、 实验任务实验测试数据基本要求:第一组数据: bt151.btr第二组数据: bt21.btr 2.求二叉树叶子结点1度结点数。 实验测试数据基本要求:第一组数据: bt261.btr第二组数据: bt21.btr3.键盘输入一个元素x,求其父节点、兄弟结点、子结点的值,不存在时给出相应提示信息。对兄弟结点孩子结点,存在时要明确指出是左兄弟、左孩子、右兄弟或右孩子。 实验测试数据基本要求:第一组数据: bt31.btr第二组数据: bt21.btr4.键盘输入一个

qq_65814357的博客 2852

数据结构-树-假设二叉树采用二叉链存储结构设计一个算法输出从根节点到每个叶子节点的路径逆序列

思路:通过非递归的后序遍历算法。将访问的结点改成,判断该结点是否是叶子结点,如果是则输出栈中所有的结点,即为从根节点到该叶子结点的路径逆序列。 这里用序遍历创建二叉树,例如:ABD#G###CE##F## 输出: G->D->B->A E->C->A F->C->A #include<stdio.h> #include<stdlib.h> #define MaxSize 100 //1.假设二叉树采用二叉链存储结构设计..

h420405961的博客 4855

二叉树的创建与存储,以及遍历

数据结构树的知识,以及二叉树的创建,存储,与遍历

mili_j的博客 4131

数据结构】树与二叉树递归序、中序、后序、层次遍历二叉树二叉树的建立以及求树高的方法

递归序、中序、后序、层次遍历二叉树二叉树的建立以及求树高的方法

ChenZHIHAO_y的博客 1816

编写算法二叉树给定结点的所有祖先结点_带你搞定考研二叉树算法(下)...

递归数据结构的定义 ▼▼▼采用递归方式定义的数据结构称为递归数据结构。在递归数据结构定义中包含的递归运算称为基本递归运算。对于二叉树采用递归数据结构的定义如下:RD = (D,Op)其中,D是所有二叉树(含空二叉树)的集合Op={op1,op2}:op1(b)=b->lchildb为含一个一个以上节点的二叉树op2(b)=b->rchild...

weixin_29224309的博客 1864

二叉树相关代码题【较全】C语言

树的相关代码题 递归递归、求高度、判断是否完全二叉树、相似二叉树、以及孩子兄弟表示法的相关例题求解

qq_42338744的博客 3278

二叉树结点的共同祖先问题

【问题描述】 假设二叉树采用二叉链表方式存储,root指向根结点,p所指结点q所指结点二叉树中的两个不同结点,且互不成为根到该结点的路径上的点,编程求解距离它们最近的共同祖先。 【输入形式】 二叉树的前序序遍历序列,用以创建该二叉树的链式存储结构;以及二叉树的两个结点数据 x y 【输出形式】 结点数据值为 x 结点数据值为 y 的最近的共同祖先,若没有共同祖先输出NULL...

Starry_皮皮星 2954

数据结构》上机实验(第七章) —树与二叉树

1. 二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之给定一棵二叉树T,采用二叉链表存储,结点结构为 其中叶结点的weight域保存该结点的非负权值。设root为指向T的根结点的指针。 typedef struct BiTNode { int weight; struct BiTNode* lchild, * rchild; }BiTNode, * BiTree; int wpl = 0; //定义一个全局变量存储wpl int wpl_PreOrder(BiTNode* ro

Miss Z的博客 2724

数据结构》上机实验(第七章) —树与二叉树

9. 设一棵二叉树中各结点的值互不相同,其序遍历序列序遍历序列分别存于两个一维数组A[1…n]B[1…n]中,建立该二叉树二叉链表。 算法思想: 在这里插入代码片 运行结果 10. 二叉树二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树算法算法思想: 在这里插入代码片 运行结果 ...

Miss Z的博客 1935

openbmc 支持mctp over pcie(三)(支持作为endpoint)

本文介绍了在Intel BHS平台上支持MCTP over PCIe端点开发的调试方法。开发基于CodeConstructAspeedTech-BMC的开源项目,将内核驱动改为模块形式以便调试。内容包括DTS配置、驱动模块设置步骤,以及如何将BMC配置为端点设备。调试过程涉及内核模块加载、MCTPD启动、参数设置等关键命令,展示了路由表、地址邻居信息的测试结果。该方案仅为实验性工作,需注意停止其他使用/dev/aspeed-mctp0接口的应用。

wit_yuan的专栏 1487

日本村田涡流纺MVS861说明书

日本村田涡流纺MVS861说明书

上一篇: python如何导入datetime包
下一篇: 某二叉树的结点数据采用顺序存储结构如下:EAF#D#H##C###GI####B(1)画出该二叉树;(2)写出结点值为D的双亲结点及左、右子树。(3)将此二叉树还原为森林。
Crystal_qwq
博客等级 码龄5年 393粉丝 32原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值