设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,链接时用叶结点的右指针域来存放单链表指针

37 篇文章 6 订阅
19 篇文章 1 订阅

LinkedList head, pre = NULL;//全局变量
LinkedList InOrder(BiTree bt) {
	if (bt) {
		InOrder(bt->lchild);//中序遍历左子树
		if (bt->lchild == NULL && bt->rchild == NULL) {//叶结点
			if (pre == NULL) {
				head = bt;
				pre = bt;
			}
			else {
				pre->rchild = bt;
				pre = bt;
			}//将叶结点链入链表
		}
		InOrder(bt->rchild);//中序遍历右子树
		pre->rchild = NULL;//设置链表尾
	}
	return head;
}

完整代码:

//设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,
//链接时用叶结点的右指针域来存放单链表指针
/*
	通常我们所用的先序、中序和后序遍历对于叶结点的访问顺序都是从左到右,这里我们
	选择中序递归遍历。算法思想:设置前驱结点pre,初始为空。第一个叶结点由指针head
	指向,遍历到叶结点时,就将它前驱的rchild指针指向它,最后一个叶结点的rchild为空。
*/

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

typedef char ElemType;
#define MaxSize 100

typedef struct BiNode {
	ElemType data;
	BiNode* lchild;
	BiNode* rchild;
}BiNode, * BiTree,* LinkedList;

typedef struct SqQueue {
	BiTree data[MaxSize];
	int front, rear;
}SqQueue;

//构建二叉树
BiNode* Create(BiNode* bt) {
	static int i = 0;
	char ch;
	//string str = "AB#D##C##";
	//string str = "124##56##7##3##";
	string str = "ABD#G##E##CF###";
	//string str = "ABDH##I##E#J##CFK###GL###";
	ch = str[i++];
	if (ch == '#')bt = NULL;//建立一棵空树 
	else {
		bt = (BiTree)malloc(sizeof(BiNode)); bt->data = ch;//生成一个结点,数据域为ch
		bt->lchild = Create(bt->lchild);//递归建立左子树
		bt->rchild = Create(bt->rchild);//递归建立右子树
	}
	return bt;
}

//typedef struct{
//	BiTree data;//结点数据
//}LNode,*LinkedList;

LinkedList head, pre = NULL;//全局变量
LinkedList InOrder(BiTree bt) {
	if (bt) {
		InOrder(bt->lchild);//中序遍历左子树
		if (bt->lchild == NULL && bt->rchild == NULL) {//叶结点
			if (pre == NULL) {
				head = bt;
				pre = bt;
			}
			else {
				pre->rchild = bt;
				pre = bt;
			}//将叶结点链入链表
		}
		InOrder(bt->rchild);//中序遍历右子树
		pre->rchild = NULL;//设置链表尾
	}
	return head;
}

void printL(LinkedList L) {
	if (L == NULL)
		return;
	while (L) {
		printf("%c ", L->data);
		L = L->rchild;
	}
}
int main() {
	//创建一棵二叉树
	BiTree T = (BiTree)malloc(sizeof(BiNode));//创建一颗二叉树
	T = Create(T);
	LinkedList L = InOrder(T);
	printf("将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,链接时用叶结点的右指针域来存放单链表指针:\n");
	printL(L);
}

 二叉树

 

### 回答1: 将二叉树节点按从左到右顺序连接成一个单链表,可以采用深度优先搜索的方法,先遍历子树,再遍历子树,最后将节点连接成链。 具体步骤如下: 1. 如果当前节点为空,则返回。 2. 如果当前节点是节点,则将其加入链中。 3. 递归遍历子树。 4. 递归遍历子树。 5. 返回链的头节点。 代码实现如下: ``` class Solution { public: TreeNode* pre = NULL; TreeNode* head = NULL; TreeNode* convert(TreeNode* root) { if (root == NULL) return NULL; if (root->left == NULL && root->right == NULL) { if (pre == NULL) head = root; else pre->right = root; pre = root; return NULL; } root->left = convert(root->left); root->right = convert(root->right); return head; } }; ``` 其中,pre示当前链的尾节点,head示链的头节点。在遍历到节点时,将其加入链中,并更新pre指针。最后返回head指针即可。 ### 回答2: 将二叉树结点从左到右顺序连成一个单链表,需要按照以下步骤: 1. 判断二叉树根节点是否为空,若为空则直接返回空链; 2. 判断根节点的子树是否为空,若子树都为空,则将根节点作为节点加入到链中; 3. 若子树为空,递归处理子树; 4. 若子树为空,递归处理子树; 5. 若子树都不为空,则递归处理子树,将子树的节点和子树的节点分别按照顺序连接到一起,并将根节点从链中删除,返回新的链头节点。 代码实现如下: ``` struct TreeNode { int val; TreeNode *left, *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; ListNode* leafList(TreeNode* root) { if (!root) return NULL; if (!root->left && !root->right) return new ListNode(root->val); ListNode *leftList = leafList(root->left); ListNode *rightList = leafList(root->right); if (!leftList) return rightList; if (!rightList) return leftList; ListNode *cur = leftList; while (cur->next) cur = cur->next; cur->next = rightList; delete root; return leftList; } ``` 该函数传入二叉树的根节点,返回链的头节点。时间复杂度为O(n),空间复杂度为O(logn)。 ### 回答3: 首先,需要了解什么是二叉树单链表二叉树是一种树形结构,其中每个节点最多有两个子节点,即子树和子树。而单链表是一种线性结构,每个节点都只有一个后继节点。 将二叉树结点按照从左到右顺序连成一个单链表,可以通过递归遍历二叉树实现。 首先,判断当前节点是否为结点,如果是,则将该节点加入到单链表中。如果不是结点,则递归遍历其子树和子树。 为了将子树的结点按照从左到右顺序加入到单链表中,可以采用一个辅助函数,该函数的作用是将两个单链表合并成一个单链表。合并时,需要遍历第一个单链表,找到其最后一个节点,然后将第二个单链表接在其后面。 最后,递归返回时,返回合并后的单链表即可。 具体实现可以参考以下代码: ``` struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(NULL) {} }; ListNode* mergeLists(ListNode* head1, ListNode* head2) { if (!head1 || !head2) { return head1 ? head1 : head2; } ListNode* cur = head1; while (cur->next) { cur = cur->next; } cur->next = head2; return head1; } ListNode* convert(TreeNode* root) { if (!root) { return NULL; } if (!root->left && !root->right) { return new ListNode(root->val); } ListNode* leftList = convert(root->left); ListNode* rightList = convert(root->right); return mergeLists(leftList, rightList); } ``` 以上代码中,convert函数用于将二叉树结点转换成单链表,mergeLists函数用于合并两个单链表。使用时,只需要调用convert(root)即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呵呵哒( ̄▽ ̄)"

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值