数据结构二叉树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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值