数据结构二叉树day37-42

这篇博客探讨了二叉树的相关算法,包括递归和非递归求解二叉树高度、交换二叉树节点的左右子树、计算双分支节点、统计度为0和1的节点、获取第K个先序遍历节点以及计算叶子节点数量。通过递归和遍历两种方法,详细介绍了每种问题的解决方案。

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

day37假设二叉树采用二叉链表存储,设计一个算法求二叉树的高度(递归和非递归实现)
[递归]算法思想 递归求左子树高度 右子树高度 取较大者+1

1、递归求解

思路概括:

若根节点为NULL,则直接返回0;----无数据
若左子树不为NULL,则递归去求左子树的高度,
若右子树不为NULL,则递归去求右子树的高度。
得到左子树和右子树的高度,
根据二叉树的高度定义:左子树和右子树中高度较大者为二叉树的高度
因此对其进行左子树和右子树高度的判断,return deep(较大者)+1;
+1代表根节点也是一层!!!


//二叉树递归求高度
int GetHeightByBiTree(BiTree * root){
   
	//第一种情况,判断是否为空
	if(root == NULL){
   
		return 0;//注意!,这里也是作为递归的出口
	}
	//递归获取左右子树的高度
	int depth_Left = GetHeightByBiTree(root->lchild);
	int depth_Right = GetHeightByBiTree(root->rchild);

	//进行比较,较大者为子树的高度
	if(depth_Left < depth_Right){
   
		return depth_Right+1//+1代表跟结点也为一层
	}else{
   
		//这里包括了depth_Left == depth_Right的情况
		return depth_Left+1;
	}
}

day38 设树B是一棵链式结构存储的二叉树,编写一个树中所有结点的左右子树进行交换的函数。【考研真题】
在这里插入图片描述

思路:

1.在对于一个问题进行具体的操作无法对其进行定义时,需要用到抽象的方法进行设计,抽象-----最佳体现便是递归。
2.递归的交换左右子树
3.先交换根节点的左右子树
4.做交换第二层的结点

这里引出C语言中最为频繁的交换代码内容:

//例子 a与b交换
int temp=a;
a=b;
b=temp;

其采用递归的方法进行设计代码如下:

//递归的交换结点
void Swap_Btree(Btree*root){
   
	Btree*temp;
	if(root==NULL){
   
		return ;}
	if(root!=NULL){
   
		//不为空
		swap(root->lchild);//交换左子树
		swap(root->rchild);//交换右子树
		//开始交换
		temp=root->lchild;
		root->lchild=root->rchild;
		root->rchild=temp;
}
}

day39
假设二叉树采用二叉链表存储结构存储,试着设计一个算法,计算一棵给定二叉树的所有双分支(度为2)的结点个数。
在这里插入图片描述
结合以上的图片进行情况分析
第一种情况:空节点则代表着左右子树的双分支节点为0,因此返回为0

第二种情况:双分支节点则代表着双分支节点的个数等于(左子树的双分支节点+右子树的双分支节点+1),+1的原因在于根节点也是一个双分支节点。

第三种情况:根节点为单分支节点,从而双分支节点的个数=(左子树中的双分支个数+右子树的个数)。

//结构体
typedef struct BiTree{
   
	int data;
	struct BiTree* lchild,*rchild; 
}*BiTree;
//递归求二叉树中的双分支节点的个数
int DoubeTreeNodeNum
### 数据结构与编程题实训资源 在学习数据结构的过程中,通过实际编程练习来巩固理论知识是非常重要的。以下是一些与头哥(可能指代某位知名博主或教育者)相关的数据结构编程题实训资料和教程的推荐[^1]。 #### 1. **《C语言入门100例》** - 这本书提供了丰富的C语言例题,涵盖了从基础到进阶的内容。如果能够熟练掌握前35道例题,将为后续的数据结构学习打下坚实的基础。书中还涉及了一些简单的数据结构实现,如数组、链表等。 #### 2. **《算法和数据结构》** - 这本书详细介绍了从语言到算法的过渡过程,并对数据结构的概念进行了深入浅出的解释。例如,数据结构被定义为计算机存储和组织数据的方式,强调了其在提高运行或存储效率中的作用[^2]。 #### 3. **趣学C语言和数据结构100例** - 这是一套结合趣味性与实践性的学习材料,适合初学者逐步掌握数据结构的核心概念。通过解决实际问题,可以加深对数据结构的理解,并提升编程能力[^3]。 #### 4. **66个代码带你通关数据结构代码题** - 这篇博客提供了66道经典的代码题,覆盖了常见的数据结构,如二叉树、链表、栈、队列等。其中还包括了二叉树的定义及先序遍历的实现示例[^4]。 ```c typedef struct BiTNode { char data; struct BiTNode* lchild; struct BiTNode* rchild; } BiTNode, *BiTree; void PreOrder(BiTree T) { if (T == NULL) return; printf("%c ", T->data); // 访问根节点 PreOrder(T->lchild); // 遍历左子树 PreOrder(T->rchild); // 遍历右子树 } ``` #### 5. **单链表通用操作函数** - 在链表的操作中,可以通过编写通用函数来处理不同类型的数据成员。例如,以下代码展示了如何定义学生类型并实现链表的基本操作[^5]。 ```c typedef struct date { int year; int month; int day; } DATE; typedef struct student { int num; char name[20]; char sex; DATE birthday; float score; } STUDENT; typedef STUDENT ElemType; typedef struct Node { ElemType data; // 数据成员data类型为ElemType类型 struct Node* next; } LNode, *LinkList; ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值