将二叉树的叶子结点转换成单链表,并返回最左叶子结点的地址(链头)

本文介绍了一种算法,该算法将二叉树的所有叶子节点按从左到右的顺序连接成一个单链表,并返回链表头部。通过递归实现,利用二叉树的先序遍历思想,有效地实现了节点间的链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

已知二叉树的链表存储结构定义为如下:

typedef struct BinTNode
{
int data;
BinTNode *lchild;
BinTNode *rchild;


BinTNode(int elemet = 0, BinTNode *left = NULL, BinTNode *right = NULL)
:data(elemet), lchild(left), rchild(right){}
}BinTNode;


编写一个递归算法,利用叶子结点中空的 右连接指针域rchild,将所有叶子结点自左向右链接成一个单链表,算法返回最左叶子结点的地址(链头)。


算法分析:可以根据二叉树的先序遍历的方法,“根左右”!

#include "stdafx.h"
#include <iostream>
using namespace std;


typedef struct BinTNode
{
	int data;
	BinTNode *lchild;
	BinTNode *rchild;

	BinTNode(int elemet = 0, BinTNode *left = NULL, BinTNode *right = NULL)
		:data(elemet), lchild(left), rchild(right){}
}BinTNode;

//递归创建二叉树
BinTNode *CreateBinTree(int arr[], int begin, int end)
{
	BinTNode *root = NULL;

	if (begin >= end)
		return root;
	
	root = new BinTNode(arr[begin]);
	root->lchild = CreateBinTree(arr, begin * 2 + 1, end);
	root->rchild = CreateBinTree(arr, begin * 2 + 2, end);
	
	return root;
}

//函数功能:递归,利用叶子结点中空的右指针域rchild,
//将所有叶子结点自左向右连接成一个单链表,返回最左叶子结点的地址

BinTNode *head = NULL;
BinTNode *temp = NULL;
void ChangleToSingleList(BinTNode *root)
{
	if (NULL == root)//树为空
		return ;
	
	//叶子结点
	if (root->lchild == NULL && root->rchild == NULL)
	{
		if(NULL == temp)
		{
			temp = head = root;
		}
		else
		{
			temp->rchild = root;
			temp = root;
		}
	}

	ChangleToSingleList(root->lchild);//左子树
	ChangleToSingleList(root->rchild);//右子树
}

int main()
{
	const int N = 10;
	int arr[N];
	for (int i = 0; i < N; i++)
		arr[i] = i + 1;

	BinTNode *root =  CreateBinTree(arr, 0, N);

	ChangleToSingleList(root);

	while (head != NULL)
	{
		cout<<head->data<<" ";
		head = head->rchild;
	}
	cout<<endl;
}


1. 一棵二叉树的顺序存储情况如下: 树中,度为2的结点数为( )。 A.1 B.2 C.3 D.4 2. 一棵“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 3.下列说法中,( )是正确的。 A. 二叉树就是度为2的树 B. 二叉树中不存在度大于2的结点 C. 二叉树是有序树 D. 二叉树中每个结点的度均为2 4.一棵二叉树的前序遍历序列为ABCDEFG,它的中序遍历序列可能是( )。 A. CABDEFG B. BCDAEFG C. DACEFBG D. ADBCFEG 5.线索二叉树中的线索指的是( )。 A.孩子 B.遍历 C.指针 D.标志 6. 建立线索二叉树的目的是( )。 A. 方便查找某结点的前驱或后继 B. 方便二叉树的插入与删除 C. 方便查找某结点的双亲 D. 使二叉树的遍历结果唯一 7. 有abc三个结点的单枝二叉树的顺序存储结构应该用( )示意。 A. a b c B. a b ^ c C. a b ^ ^ c D. a ^ b ^ ^ ^ c 8. 一颗有2046个结点的完全二叉树的第10层上共有( )个结点。 A. 511 B. 512 C. 1023 D. 1024 9. 一棵完全二叉树一定是一棵( )。 A. 平衡二叉树 B. 二叉排序树 C. 堆 D. 哈夫曼树 10.某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是( )的二叉树。 A.空或只有一个结点 B.高度等于其结点数 C.任一结点无孩子 D.任一结点无孩子 11.一棵二叉树的顺序存储情况如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 A B C D E 0 F 0 0 G H 0 0 0 X 结点D的孩子结点为( )。 A.E B.C C.F D.没有 12.一棵“完全二叉树”结点数为25,高度为( )。 A.4 B.5 C.6 D.不确定 二、填空题(每空3分,共18分)。 1. 树的路径长度:是从树根到每个结点的路径长度之和。对结点数相同的树来说,路径长度短的是 完全 二叉树。 2. 在有n个叶子结点的哈夫曼树中,总结点数是 2n-1 。 3. 在有n个结点的二叉表中,值为非空的域的个数为 n-1 。 4. 某二叉树的中序遍历序列和后序遍历序列正好相反,则该二叉树一定是 任一结点无孩子 的二叉树。 5. 深度为 k 的二叉树多有 个结点,少有 k 个结点。 三、综合题(共58分)。 1. 假定字符集{a,b,c,d,e,f }中的字符在电码中出现的次数如下: 字符 a b c d e f 频度 9 12 20 23 15 5 构造一棵哈夫曼树(6分),给出每个字符的哈夫曼编码(4分),计算哈夫曼树的加权路径长度WPL(2分)。 (符合WPL小的均为哈夫曼树,答案不唯一) 哈夫曼编码: 2. 假设用于通信的电文由字符集{a,b,c,d,e,f,g}中的字符构,它们在电文中出现的频率分别为{0.31,0.16,0.10,0.08,0.11,0.20,0.04}。要求: (1)为这7个字符设计哈夫曼树(6分)。 (2)据此哈夫曼树设计哈夫曼编码(4分)。 (3)假设电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少?(4分) (1) 为这7个字符设计哈夫曼树为(符合WPL小的均为哈夫曼树,答案不唯一): (2) 哈夫曼编码为: a:01;b:001;c:100;d:0001;e:101;f:11;g:0000 (3) 假设电文的长度为100字符,使用哈夫曼编码比使用3位二进制数等长编码使电文总长压缩多少? 采用等长码,100个字符需要300位二进制数,采用哈夫曼编码发送这100个字符需要261二进制位,压缩了300-261=39个字符。压缩比为39/300=13%。 3. 二叉数T的(双亲到孩子的)边集为: { <A,B>, <A,C>, <D,A>, <D,E>, <E,F>, <F,G> } 请回答下列问题: (1)T的根结点(2分): (2)T的叶结点(2分): (3)T的深度(2分): (4)如果上述列出边集中,某个结点只有一个孩子时,均为其孩子;某个结点有两个孩子时,则先列出了连接孩子的边后列出了连接孩子的边。画出该二叉树其及前序线索(6分)。 (1)T的根结点 (2)T的叶结点(3)T的深度 : (4)二叉树其及前序线索为: 4.现有以下按前序和中序遍历二叉树的结果: 前序:ABCEDFGHI 中序:CEBGFHDAI 画出该二叉树的逻辑结构图(5分),在图中加入中序线索(5分)。 5.有电文:ABCDBCDCBDDBACBCCFCDBBBEBB。 用Huffman树构造电文中每一字符的优通讯编码。画出构造的哈夫曼树,给出每个字符的哈夫曼编码方案。(符合WPL小的均为哈夫曼树,答案不唯一) (1)构造哈夫曼树(6分): (2)哈夫曼编码方案(4分):
要将二叉树的叶子节点连接单链表,可以使用递归的方法来实现。首先,我们需要定义两个指针,head和tail,分别表示单链表结点和尾结点。初始时,head和tail都为空。 然后,我们可以使用一个递归函数来遍历二叉树的所有节点。在遍历过程中,如果当前节点是叶子节点,即没有子节点,那么我们将该节点添加到单链表中。如果head为空,说明这是第一个叶子节点,我们将head和tail都指向该节点;否则,我们将tail的孩子指针指向该节点,将tail更新为该节点。 接着,我们需要递归地对当前节点的子树和子树进行遍历,直到遍历完整个二叉树为止。 后,返回head指针,即可得到将二叉树叶子节点连接单链表。 参考文献: 题目: 利用结点的孩子指针将一个二叉树叶子结点链接一个单链表。(head指向第一个,tail指向一个) 3.二叉树采用二叉表,利用结点的孩子指针rchild二叉树叶子结点按照从的顺序串一个单链表(定义两个指针,head与tail,head指向第一个叶子结点,head初值为空,tail指向下一个) 数据结构课程设计报告(仓库管理系统、通讯录管理系统、猴子选大王、二叉树叶子结点单链表)<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [二叉树:将叶子结点链接一个单链表递归)](https://blog.youkuaiyun.com/weixin_45682058/article/details/121505366)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [树与二叉树应用之统计结点数以及将叶子结点串联单链表](https://blog.youkuaiyun.com/Mind_programmonkey/article/details/85265978)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [数据结构课程设计报告(仓库管理系统、通讯录管理系统、猴子选大王、二叉树叶子结点单链表).doc](https://download.youkuaiyun.com/download/oligaga/85736767)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值