【数据结构】二叉树递归算法代码总结

news2024/11/15 18:06:13

文章目录

  • 一、内容介绍
  • 二、算法总结
    • 2.1 二叉树结构
    • 2.2 完整代码
    • 2.3 输出结果
  • 三、Reference
  • 四、总结

一、内容介绍

上一年备考数据结构中自己整理并验证过的二叉树递归算法。包括:
1、二叉树的创建;
2、二叉树的先、中、后序的递归遍历;
3、输出二叉树中所有度为2的节点;
4、输出二叉树中所有度为1的节点;
5、输出二叉树中所有度为0的节点;
6、输出二叉树中所有节点的个数;
7、输出二叉树中所有节点的度数;
8、输出二叉树的高度;
9、输出二叉树先序遍历中第三个节点值;
10、输出二叉树先序遍历中data域为65的节点;
11、输出二叉树中 右孩子指针将二叉树的叶子节点从左向右链接成的单链表;
12、输出二叉树根节点的右孩子节点的层数;

二、算法总结

2.1 二叉树结构

在这里插入图片描述

2.2 完整代码

#include<stdio.h>
#include<stdlib.h>
#include <iostream> 

using namespace std;
 


//二叉树的链式存储结构 
struct Tree{
	char data;   
//	int data;     //会自动转为ASCII码 
	struct Tree *lchild,*rchild;
};

//前序创建二叉树
void CreateTree(Tree **t) {
	char ch;
  	cin >> ch;
  	//递归的终止条件,如果输入#号创建空指针,说明当前节点左子树已创建完毕
  	if (ch == '#')
    	*t = NULL;

	else {
		*t = new Tree;
		(*t)->data = ch;
		CreateTree(&((*t)->lchild));
		CreateTree(&((*t)->rchild));
	}
}

//二叉树的三种遍历

void visit(Tree *t){
	//对结点的一些操作 
	cout << t->data << "  ";
} 



//先序 
void preorder(Tree *t){
	if(t!=NULL){
		visit(t);
		preorder(t->lchild);
		preorder(t->rchild);
	}
}

//中序 
void inorder(Tree *t){
	if(t!=NULL){
		inorder(t->lchild);
		visit(t);
		inorder(t->rchild);
	}
}

//后序 
void postorder(Tree *t){
	if(t!=NULL){
		postorder(t->lchild);
		postorder(t->rchild);
		visit(t);
	}
}

//计算二叉树的所有双分支节点(度为2)节点个数
int Degree_2(Tree *t){
    if(t==NULL){    //为空节点 
        return 0;
    }else if(t->lchild!=NULL && t->rchild!=NULL){    //为双分支节点 
    	return Degree_2(t->lchild)+Degree_2(t->rchild)+1;   //双分支节点个数=递归的双分支节点数+自己 
    }else{   //为单分支节点
    	return Degree_2(t->lchild)+Degree_2(t->rchild);    //双分支节点个数=递归的双分支节点数
    }
}

//计算二叉树的所有单分支节点(度为1)节点个数
int Degree_1(Tree *t){
    if(t==NULL){
        return 0;
    }else if(t->lchild!=NULL && t->rchild==NULL || t->lchild==NULL && t->rchild!=NULL){    //单分支节点 
    	return Degree_1(t->lchild)+Degree_1(t->rchild)+1;
    }else{
    	return Degree_1(t->lchild)+Degree_1(t->rchild);
    }
}

//计算二叉树的所有叶子节点(度为0)节点个数
int Degree_0(Tree *t){
    if(t==NULL){
        return 0;
    }else if(t->lchild==NULL && t->rchild==NULL){
    	return 1;
    }else{
    	return Degree_0(t->lchild)+Degree_0(t->rchild);
    }
}

//计算二叉树的所有节点个数
int n = 0;
int count(Tree *t){
	if(t!=NULL){
		++n;    //先序:根节点visit()改写,每次递归,n=n+1 
		count(t->lchild);
		count(t->rchild);
	}
	return n;
}


//计算二叉树高度 
int depth(Tree *t){
	if(t==NULL){
        return 0;    //递归到空树,返回0 
    }else{
    	int lh = depth(t->lchild);    //递归求左子树高 
    	int rh = depth(t->rchild);    //递归求右子树高 
		if(lh>=rh){
			return lh+1;
		}else{
			return rh+1;
		}
    } 
}


//把二叉树中所有节点的左右子树交换 
void swap(Tree *t) {
	if(t!=NULL){
		Tree *temp = new Tree();   //临时变量 
    	temp = t->lchild;
    	t->lchild = t->rchild;
    	t->rchild = temp;
    	swap(t->lchild);    //递归交换左 
    	swap(t->rchild);    //递归交换右 
    }
}


//求二叉树先序遍历中的第k个节点值 
int i = 0;
void find_k(Tree *t, int k){
	if(t!=NULL){
		++i;     //visit()
		if(k==i){
			cout<< t->data;
			return;
		}else{
			find_k(t->lchild,k);    //递归查左 
    		find_k(t->rchild,k);    //递归查右边
		}

	}
}

//查找二叉树data域等于key的节点是否存在,若存在,将q指向它,否则q为空 
void find_key(Tree *t,Tree *q,int key){
	if(t!=NULL){
		if(t->data==key){   //找到 
			q=t;
			cout<<q->data;
		}else{
		   	find_key(t->lchild,t,key);    //递归查左 
    		find_key(t->rchild,t,key);    //递归查右 
		}

    }
}

//利用节点的右孩子指针将一个二叉树的叶子节点从左向右链接成一个单链表(head指向第一个,tail指向最后一个) 
void link(Tree *t,Tree *head,Tree *tail){
	if(t!=NULL){
		if(t->lchild==NULL&&t->rchild==NULL){    //叶子节点 
			 if(head==NULL){    //还未指向时 
				head=t;
				tail=t;
			}
			tail->rchild=t;   //链接 
			tail=t;
			cout<<t->data<< "  ";
			
			
		}else{   //非叶子节点,递归 
			link(t->lchild,head,tail); 
			link(t->rchild,head,tail);  
		}
	} 
}


int h=0;
//求出指定节点在二叉排序树中的层次
//中序遍历二叉排序树得一个递增的序列 
int find_ceng(Tree *t,Tree *p) {
	if(t!=NULL){
		Tree *head=t;
		if(head!=NULL){
			while(head->data!=p->data){
				if(head->data<=p->data){
					head=head->rchild;
				}else{
					head=head->lchild;
				}
				++h;
			}
			return h;
		}
	} 
}

//求二叉树的带权路径长度

int wpl_inorder(Tree *t,int deep){
	int wpl=0;
	if(t!=NULL){ 
		if(t->lchild==NULL&&t->rchild==NULL){    //叶子节点
//			cout<<int(t->data); 
			wpl+=(int(t->data))*deep;
		}
		
//		cout<<"here2"; 
		if(t->lchild!=NULL)
			wpl_inorder(t->lchild,deep+1);   //递归左
		if(t->rchild!=NULL)
			wpl_inorder(t->rchild,deep+1);   //递归右
		return wpl;
	
	}
	

}


int main(){
	
	Tree *t;
	cout << "请按先序遍历的顺序创建二叉树,ABD##E##CF##G##" << endl;
	CreateTree(&t);
	cout << "先序遍历的结果为:";
	preorder(t) ;
	cout << endl;
	
	cout << "中序遍历的结果为:";
	inorder(t) ;
	cout << endl;

	cout << "后序遍历的结果为:";
	postorder(t) ;
	cout << endl;
	
	cout << "二叉树中所有度为2的节点:";
	cout << Degree_2(t);
	cout << endl; 
	
	cout << "二叉树中所有度为1的节点:";
	cout << Degree_1(t);
	cout << endl; 
	
	cout << "二叉树中所有度为0的节点:";
	cout << Degree_0(t);
	cout << endl; 
	
	cout << "二叉树的所有节点个数:";
	cout << count(t);
	cout << endl; 
	
	cout << "二叉树的高度:";
	cout << depth(t);
	cout << endl; 

	cout << "二叉树先序遍历中的第3个节点值 :";
	find_k(t,3);
	cout << endl; 

	cout << "二叉树先序遍历中data域等于65的节点 :";
	Tree *q = NULL;
	find_key(t,q,65);
	cout << endl; 
	
	cout << "右孩子指针将二叉树的叶子节点从左向右链接成一个单链表:";
	Tree *head = NULL;
	Tree *tail = NULL;
	link(t,head,tail);
	cout << endl; 
	
	cout << "求二叉树根节点的右孩子节点的层次:";
	Tree *p = t->rchild;
	cout << find_ceng(t,p);
	cout << endl; 
	
//	cout << "求二叉树的wpl:";
//	cout << wpl_inorder(t,0);
//	cout << endl; 
}


2.3 输出结果

在这里插入图片描述

三、Reference

大师兄的手把手教你写考研数据结构代码题:https://www.bilibili.com/video/BV1hQ4y1R7Tw

四、总结

这份总结分享给有需要的同学们。也希望2022年自己的努力,开花结果。

2023年1月3日于家中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[项目说明]-基于人工智能博弈树,极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。

个人选题项目 基于人工智能博弈树&#xff0c;极大极小(Minimax)搜索算法并使用Alpha-Beta剪枝算法优化实现的可人机博弈的AI智能五子棋游戏。 设计目标及主要内容 本系统是根据传统五子棋游戏的功能编写&#xff0c;其功能实现了基于AI人工智能算法实现智能的人机对弈五子棋…

Java jdk安装及环境配置

Java环境安装一、 jdk和jre的安装1、安装目录创建java文件夹2、java文件夹内创建jdk和jre3、解压下载好的jdk安装包二、环境变量的配置一、 jdk和jre的安装 首先下载jdk 1、安装目录创建java文件夹 2、java文件夹内创建jdk和jre 3、解压下载好的jdk安装包 双击运行解压的jdk …

Kali Linux中shutdown指令的用法3-2

2.4 屏蔽重启指令 -h参数表示屏蔽重启指令&#xff0c;使用如图6所示的指令&#xff0c;可以屏蔽reboot指令&#xff0c;该指令的作用为关闭&#xff08;poweroff&#xff09;系统。 图6 屏蔽重启指令 从图6中可以看出&#xff0c;-h屏蔽了--reboot。 需要注意的是&#xff…

关于OLTP 和OLAP 干货知识分享

OLTP 和 OLAP 这两个概念在十来年前、十几年前BI这个词还不是那么普及的时候&#xff0c;还经常放在一起做比较&#xff0c;现在已经很少再单独拿出来做对比了&#xff0c;但也总还是有人会问到&#xff0c;我在这里大概讲下两个概念的差别和联系。 什么是OLTP OLTP 英文全称…

81.Zabbix之Window服务器agent监控

Zabbix版本:6.2.3 1.官网上下载对应的agent Download Zabbix agents 我们下载Zabbix agent 2 2.配置Zabbix agent2 下载完成后,将压缩包复制到服务器,然后放在移至C盘目录下(其他目录也是可以的),然后进行解压。 3.修改配置文件 用文本编辑软件打开zabbix_agent2.c…

DC-4靶场练习

今天抽时间做了下DC-4的实验&#xff0c;整理了实验步骤&#xff0c;并提炼总结方法论。内网存活主机扫描命令nmap -sP 192.168.101.0/24 arp-scan -l以上IP地址使用排除法,最后得出192.168.101.79是靶机地址。探测目标开放的端口推荐masscannmap快速扫描&#xff1a;masscan -…

【谷粒商城基础篇】整合SpringCloud、SpringCloud alibaba

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念&#xff08;第一、二章&#xff09;基础环境搭建&#xff08;第三章&#xff09;整合SpringCloud整合SpringCloud、SpringCloud alibaba&#xff08;第四、五章&#xff09;前端知…

【ACWING】【4645选数异或】

给定一个长度为 n 的数列 A1,A2,,An 和一个非负整数 x&#xff0c;给定 m 次查询&#xff0c;每次询问能否从某个区间 [l,r] 中选择两个数使得他们的异或等于 x。 输入格式 输入的第一行包含三个整数 n,m,x。 第二行包含 n 个整数 A1,A2,,An。 接下来 m 行&#xff0c;每行包含…

单片机基础之初识串口

目录 一、初识串口 1、串口基本知识 2、串口的特点 3、了解下全双工和半双工的区别 二、关于串口的电器标准和协议 1、RS-232 2、RS-422 3、RS-485 三、关于串口的电平 1、RS232 电平 2、TTL电平 四、串口通信 1、串口接线方式 2、串口编程要素 3、波特率 4、编…

【练习】day02(未完成版)

努力经营当下直至未来明朗&#xff01; 文章目录一、选择二、编程1. 全排列2. 全排列II答案1. 选择2. 编程普通小孩也要热爱生活&#xff01; 一、选择 此代码片段输出正确的值是&#xff08; &#xff09; public class CharToString {public static void main(String[] ar…

Flink窗口的生命周期

&#x1f34a;在 Apache Flink 中&#xff0c;窗口是对数据流中的一个固定数量的元素或者一段时间内的元素进行分组的一种抽象概念。窗口有自己的生命周期&#xff0c;即从窗口的开始到窗口的结束。 &#x1f34a;窗口的开始和结束可以是以下几种情况之一&#xff1a; 按数据…

WALLET 通证减半:早期用户分配将降至 4%

WALLET 通证即将满 1 年&#xff0c;这意味着根据 Ambire 钱包白皮书&#xff0c;它的年度早期用户供应量将削减至 4%&#xff0c;随着应用率的增长&#xff0c;通货膨胀率将大幅降低。 WALLET 一周年 根据官方消息&#xff0c;WALLET 通证的生成&#xff08;token generation …

差分矩阵(二维)

题目&#xff1a; 输入一个 n行 m列的整数矩阵&#xff0c;再输入 q个操作&#xff0c;每个操作包含五个整数 x1,y1,x2,y2,c其中 (x1,y1)(x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c。 请你将进行完所有…

React Native 路由篇 react-navigation

1.我这边使用的是react-navigation&#xff0c;参照官网安装完启动&#xff0c;执行 npm install react-navigation/native。在安卓模拟器会报这个错误“invariant violation: requirenativecomponent: “rncsafeareaprovider” was not found in the uimanager”&#xff0c;其…

Java网络编程

一、IO模型 IO模型就是说用什么样的通道进行数据的发送和接收&#xff0c;Java共支持3种网络编程IO模式&#xff1a; BIONIOAIO 1.BIO 1.1基本介绍 Blocking I/O&#xff0c;同步阻塞&#xff08;传统阻塞型&#xff09;&#xff0c;服务器实现模式为一个连接一个线程&…

CSS初级教程(轮廓)【第五天】

CSS初级教程【第五天】【1】CSS 框模型【2】CSS 轮廓【3】CSS 轮廓宽度【4】CSS 轮廓颜色【5】CSS 轮廓简写【6】CSS 轮廓偏移【7】所有 CSS 轮廓属性CSS上回学习链接 CSS初级教程 颜色【第一天】 CSS初级教程 背景【第二天】 CSS初级教程 边框【第三天】 CSS初级教程 边距、高…

数据压缩算法PCA使用指南

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 PCA主成分分析算法 PCA的使用范围 PCA(principal Component Analysis)&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据压缩算法。 在PCA中&#xff0c;数据从原来的坐标系转换到新的坐标…

【2023.01.03】定时执行专家 V6.5 更新日志 - TimingExecutor V6.5 Change Log

目录 ◆ 最新版下载链接 ◆ 软件更新日志 – TimingExecutor Full Change Log ▼ 2023-01-03 V6.5 ▼ 2022-12-25 V6.4 ▼ 2022-11-15 V6.3 ▼ 2022-10-01 V6.2 ▼ 2022-07-30 V6.1&#xff08;Build 769.30072022&#xff09; ▼ 2022-06-30 V6.0 ▼ 2022-…

《学术规范与论文写作》总结

文章目录一、写作规范二、写作准备三、论文架构3.1 标题3.2 摘要3.3 关键词&#xff08;可省&#xff09;3.4 引言3.5 相关工作&#xff08;研究背景&#xff09;3.6 实现细节3.7 实验部分3.8 结论四、写作技巧五、其他技巧5.1 算法伪代码5.2 图片5.3 写作语言一、写作规范 写…

短视频剪辑素材在哪里找?

视频剪辑没素材&#xff0c;推荐5个网站帮你解决&#xff0c;免费可商用&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 网站有超多视频素材&#xff0c;全部都是高清无水印&#xff0c;各种类型都有&#xff0c;像自然、城市…