二叉树的链式访问 与 二叉树专题

目录

  • 二叉树的前、中、后序遍历
  • 求二叉树第K层节点的个数
  • 二叉树查找值为x的节点
  • leetcode相同的树
  • 对称二叉树
  • 二叉树的前序遍历
  • 另一棵子树
  • 牛客 二叉树的遍历

二叉树的前、中、后序遍历

1.前序遍历:先访问节点,再访问子树,最后访问子树
根 左 右
2.中序遍历:先访问子树,再访问,最后访问子树
左 根 右
3.后序遍历:先访问子树,再访问子树,最后访问
左 右 根

N 表示 NULL
前序访问顺序:1 2 3 N N N 4 5 N N 6 N N
中序访问顺序:N 3 N 2 N 1 N 5 N 4 N 6 N
后序访问顺序:N N 3 N 2 N N 5 N N 6 4 1
在这里插入图片描述

求二叉树第K层节点的个数

子问题是:root不为空,k不等于1
转化为求左子树加右子树第三层的节点个数
每层k都减1,如果该层有root == NULL就返回0
在这里插入图片描述


//求二叉树第k层的节点个数 
int TreeLevelKSize(BTNode* root,int k)
{if (root == NULL)return 0;if (k == 1)return 1;return TreeLevelKSize(root->left, k-1) + TreeLevelKSize(root->right, k-1);
}

二叉树查找值为x的节点

找到一个值为x的节点就返回,因为函数只有一个返回值
return 只能返回给上一层
如果找到了不存入一个变量中,找到的值就会重复找(后面会丢失找到的值)

//二叉树查找值为x的节点
BTNode* TreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->val == x)return root;//只能返回给它的上一层//前序遍历BTNode* ret1 = TreeFind(root->left, x);if (ret1)return ret1;BTNode* ret2 = TreeFind(root->right, x);if (ret2)return ret2;//都没找到return NULL;
}

leetcode相同的树

在这里插入图片描述
思路:
比较两棵树的根,左子树和右子树是否相等
1.两棵树的根都为NULL,返回true
2.其中一棵树的根为NULL,两树的节点不相同返回false
3.两树的根都不为NULL,比较两树的根的值
4.子问题:遍历两树的左子树和右子树(比较左根和右根)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{if(p == NULL&&q == NULL)return true;//其中一个节点为空,另一个节点不为空,返回falseif(p == NULL || q == NULL)return false;//两个节点都不为空if(p->val != q->val)return false;return isSameTree(p->left,q->left) && isSameTree(p->right,q->right);
}

对称二叉树

在这里插入图片描述
思路:
这题和上一题很想,可以理解为镜像二叉树(即一棵树的左子树和右子树要一样,一棵树的右子树和左子树要一样)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
bool _isSymmetric(struct TreeNode* p,struct TreeNode* q)
{if(p == NULL&&q == NULL)return true;if(p == NULL||q == NULL)return false;if(p->val != q->val)return false;return _isSymmetric(p->left,q->right)&&_isSymmetric(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root) 
{return _isSymmetric(root->left,root->right);
}

二叉树的前序遍历

在这里插入图片描述
思路:
1.先算出二叉树中有多少个节点,再开辟这么多个节点
这样不会造成空间不足或空间浪费
2.i 是数组的下标,要用指针传递过去,不用指针的话,形参i的改变不会影响实参i,可能会覆盖前面的值
在这里插入图片描述
3.前序遍历,如果有节点就把节点中的值放入数组中,如果没有就返回NULL,遵循根左右依次把值放入数组中

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*/
/*** Note: The returned array must be malloced, assume caller calls free().*/
//算出树的节点个数
int TreeSize(struct TreeNode* root)
{return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
//前序遍历
void preorder(struct TreeNode* root,int* arr,int* pi)
{if(root == NULL)return;arr[(*pi)++] = root->val;preorder(root->left,arr,pi);preorder(root->right,arr,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{*returnSize = TreeSize(root);int* arr = (int*)malloc(sizeof(int)*(*returnSize));//前序遍历int i = 0;//下标是一个小坑,如果不用指针,每次递归调用i的值是形参有时会覆盖前面的值preorder(root,arr,&i);return arr;
}

另一棵子树

在这里插入图片描述
思路:
1.root在走,直到root == NULL都没找到值和subRoot相同的节点,那么就返回false
2.如果能找到和root相同的节点,那么比较root后面的节点(子树中)是否和subRoot相同
3.只要找到一个子树是和subRoot相同的那么就返回true

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     struct TreeNode *left;*     struct TreeNode *right;* };*///这里面子树与另一题两个子树是否相同有一样的逻辑
bool issametree(struct TreeNode* p,struct TreeNode* q)
{if(p == NULL&&q == NULL)return true;if(p == NULL || q == NULL)return false;if(p->val != q->val)return false;return issametree(p->left,q->left) && issametree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot)
{//subRoot不为空,使用root在递归,所以root可能会走到空false//subRoot至少有一个节点if(root == NULL)return false;if(root->val == subRoot->val&&issametree(root,subRoot))return true;//root在走,subRoot不走,之后利用root和subRoot相等的节点,再用issametree比较是否是子树return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

牛客 二叉树的遍历

在这里插入图片描述
思路:
总体来说是先开一个100个字符的字符串数组,然后构建节点,最后中序遍历打印数组
1.构建节点时要注意如果root == ‘#’时,不能在判断的时候(*pi)++,如果它不是‘#’的话还++就跳过一个字符了
2.开1个节点的树,就把数组中的值放入树中,然后为左树和右树开辟一个节点,最后返回根节点,把各个节点链接起来return root是为了链接节点

#include <stdio.h>
#include<stdlib.h>typedef struct TreeNode
{ struct TreeNode* left;struct TreeNode* right;int val;
}TreeNode;
//构建节点
TreeNode* CreatTree(char* a,int* pi)
{if(a[*pi] == '#'){(*pi)++;return NULL;}//非空TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));root->val = a[(*pi)++];//下面这里没有想出来,递归root的左边创建一个节点,//然后递归root的右边创建一个节点,//最后返回根,链接起来root->left = CreatTree(a,pi);root->right = CreatTree(a,pi);return root;
}
//中序遍历
void order(TreeNode* root)
{if(root == NULL)return;order(root->left);printf("%c ",root->val);order(root->right);
}
int main() 
{char a[100];scanf("%s",a);int i = 0;TreeNode* ret = CreatTree(a,&i);order(ret);return 0;
}

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

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

相关文章

【备忘】fastadmin 如何获取列表选中行的pk

去官方搜没搜出来&#xff0c;还得是万能的网友厉害。 //获取选中项 $(document).on("click", ".btn-selected", function () {// 获取选中项idsconsole.log(JSON.stringify(Table.api.selectedids(table)));// 获取选中项所有数据console.log(JSON.strin…

输入一个整数n,输出n的约数为质数的数?两个问题n的约数问题和n的质数问题

输入一个整数n&#xff0c;输出n的约数为质数的数&#xff1f; 一.首先解决n的质数的问题&#xff08;1&#xff09;枚举法&#xff08;2&#xff09;埃氏筛 二.解决n的质数约数问题 一.首先解决n的质数的问题 &#xff08;1&#xff09;枚举法 考虑质数的定义&#xff1a;在大…

conda中创建环境并安装tensorflow1版本

conda中创建环境并安装tensorflow1版本 一、背景二、命令三、验证一下 一、背景 最近需要使用tensorflow1版本的&#xff0c;发个记录&#xff01; 二、命令 conda create -n tf python3.6 #创建tensorflow虚拟环境 activate tf #激活环境&#xff0c;每次使用的时候都…

理解策略梯度方法:从REINFORCE到PPO

今年2月的时候&#xff0c;导师突然告诉我Ron William离世了。他算是我导师的 a life time friend&#xff0c;关系很好&#xff0c;我做毕业论文的时候&#xff0c;他还来参与了论文的答辩。Ron是一个很友善的老头&#xff0c;和他在强化学习领域的影响力比起来&#xff0c;本…

汽车信息安全--数据安全:图像脱敏

General 随着车联网的发展&#xff0c;汽车越来越智能化&#xff0c;就像是一部“装着四个轮子的手机”。 有人说&#xff0c;智能手机就如同一部窃听器&#xff0c;无论你开机或者关机&#xff0c;它都会无时不刻地监听着用户的一举一动。 可想而知&#xff0c;智能车辆上…

马工程刑法期末复习笔记重点2

马工程刑法期末复习笔记重点2

SpringBoot 参数校验

参数校验 引入springvalidation依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId> </dependency>参数前添加Pattern public Result registry(Pattern(regexp &qu…

Java面向对象练习(2.商品类)(2024.7.4)

商品类 package Supermarket20240704;public class Commodity {private String name;private double price;private int inventory;public Commodity(){};public Commodity(String name, double price, int inventory){this.name name;this.price price;this.inventory inv…

Java核心技术【十九】Iterator与增强for循环

Java中的Iterator与增强for循环 在Java编程中&#xff0c;迭代是处理集合元素的一种常见操作。Java提供了多种迭代集合元素的方式&#xff0c;其中最常用的两种是Iterator和增强for循环&#xff08;也称为“for-each”循环&#xff09;。本文将深入探讨这两种迭代方式的特性和…

CLAM用于弱监督WSI分析

计算病理学&#xff08;computational pathology&#xff09;下的深度学习方法需要手动注释大型 WSI 数据集&#xff0c;并且通常存在领域适应性和可解释性较差的问题。作者报告了一种可解释的弱监督深度学习方法&#xff0c;只需要WSI级标签。将该方法命名为聚类约束注意力多实…

Perl 格式化输出:提升代码可读性的技巧

引言 Perl 是一种功能强大的脚本语言&#xff0c;广泛用于文本处理、系统管理、网络编程等多个领域。在 Perl 编程中&#xff0c;代码的格式化输出不仅有助于提升代码的可读性&#xff0c;还能增强程序的用户体验。本文将详细介绍如何在 Perl 中实现代码的格式化输出。 Perl …

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十一)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 31 节&#xff09; P31《30.数据持久化-关系型数据库》 上一节中学习了使用用户首选项的方式实现数据持久化&#xff0c;但用户首…

微机原理 选择题

D C MOV、PUSH、POP、XLAT&#xff08;查表&#xff09;、IN、OUT不影响标志位 D B D C D C D B 1. (单选题, 5分)8位无符号数(字节)表示的数值范围是( ), 16位无符号数(字)表示的数值范围是( )。 A. 0~128 0~32768B. 0~255 0~655…

为什么 npm run serve 正常,npm run build 就报错:digital envelope routines::unsupported

这个错误通常与 Node.js 版本和使用的加密算法有关。让我解释一下原因和可能的解决方案&#xff1a; 错误原因 这个错误&#xff08;“error:0308010C:digital envelope routines::unsupported”&#xff09;通常发生在以下情况&#xff1a; 使用较新版本的 Node.js&#xf…

Vscode快捷键崩溃

Vscode快捷键崩溃 Linux虚拟机下使用vscode写代码【ctrlA&#xff0c;CtrlC&#xff0c;CtrlV】等快捷键都不能使用&#xff0c;还会出现“NO text insert“等抽象的指令&#xff0c;问题就是不知道什么时候装了一个VIM插件&#xff0c;让他滚出电脑》》》

监听 web 容器内的网络请求(错误的方案)

需求 iOS 项目中 wkwebview 实现的 web 容器&#xff0c;需要监听 web 容器内的所有网络请求 实现 在 iOS 项目中使用 WKWebView 实现的 Web 容器&#xff0c;监听 Web 容器内的网络请求是一个常见需求。可以通过实现 WKURLSchemeHandler 协议来处理自定义的 URL scheme&#…

通过 API 接口管理 Kafka

文章目录 前言Topic 管理配置管理消费者群组管理查看消费者群组修改消费者群组 为主题添加分区从主题中删除消息首领选举 前言 除了通过命令行和可视化界面对 kafka 进行管理&#xff0c;也可以通过 AdminClient的 API 对 kafka 进行管理。本文将介绍如何通过 AdminClient 进行…

[Vue学习]生命周期及其各阶段举例

当我们运行vue项目&#xff0c;看到了屏幕上显示的界面&#xff0c;看到了界面上显示的数据和标签&#xff0c;之后将这个界面叉掉&#xff0c;这一过程其实经历了一整个vue的生命周期的四个阶段&#xff0c;即创建阶段、挂载阶段、更新阶段以及销毁阶段, 而对于每个阶段的启动…

使用 pyecharts 渲染成图片程序报错: echarts is not defined问题处理

背景 之前写的使用 snapshot_selenium 来保存pyeacharts渲染成的网页截图&#xff0c;可以正常运行。程序搁置了半年&#xff0c;不知道动了电脑哪里&#xff0c;再次运行程序时&#xff0c;程序开始报错&#xff1a;JavascriptException: javascript error: echarts is not d…

【SQL】已解决:SQL分组去重并合并相同数据

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;SQL分组去重并合并相同数据 在数据库操作中&#xff0c;数据的分组、去重以及合并是常见需求。然而&#xff0c;初学者在编写SQL语句时&#xff0c;可能会遇到一…