首页 > 其他分享 >树相关知识点--零碎笔记

树相关知识点--零碎笔记

时间:2023-05-20 23:31:54浏览次数:56  
标签:知识点 遍历 后序 -- 前序 零碎 二叉树 root 节点

深入理解前中后序

  1. 二叉树的前中后序遍历是什么?
  1. 前中后序遍历,即二叉树结构的前中后位置
  1. 前序遍历-即刚刚进入一个节点的时候
  2. 中序遍历-即进入节点之后未离开节点之前
  3. 后序遍历-即即将离开第一个节点的时候
  1. 前中后序是遍历二叉树过程中处理每一个节点的三个特殊时间点
  1. 前--刚刚进入一个二叉树节点的时候执行
  2. 后--将要离开一个二叉树节点的时候执行
  3. 中--在一个二叉树左子树遍历完,即将开始遍历右子树的时候执行
  1. 后序遍历有什么特殊之处?
  1. 前序位置的代码只能从函数参数中获取父节点传递来的数据
  2. 后序位置的代码不仅可以获取参数数据,还可以获取到子树通过函数返回值传递回来的数据 1.
  1. 为什么多叉树没有中序号遍历?
  1. 在二叉树中每一个节点都只会进行唯一一次左右子树的切换
  2. 多叉树可能有很多个子节点,会多次切换子树去遍历
  3. 因此多叉树节点没有唯一的中序遍历位置

二叉树问题本质

二叉树的所有问题,就是在前中后序位置注入巧妙的代码逻辑,从而达到目的。因此只需要单独思考每一个节点应该做什么即可,其他交给二叉树的遍历框架,递归会在所有的节点上做相同的操作。

解题思路

  1. 二叉树题目的递归解法可以分为两类思路
  1. 第一类:遍历一遍二叉树得出答案,即回溯算法核心框架
  2. 第二类:通过分解问题计算出答案,即动态规划核心框架
  1. 是否可以通过遍历一遍二叉树得到答案
  2. 是否可以定义一个递归函数,通过子问题(子树)的答案推倒出原问题的答案?
  1. 如果可以,仔细思考如何定义递归函数

中序遍历的重要性

  1. 中序遍历按照左根右的顺序进行遍历
  2. 遍历出来的数据具有非递减的性质,相当于遍历有序数组

后序遍历的特殊之处

  1. 前序位置的代码只能从函数参数中获取父节点传递来的数据
  2. 后序位置代码不仅可以获取参数数据,还可以获取到子树通过返回值传递回来的数据
  3. 使用例题说明
  1. 如果把根节点看作第一层,打印出每一个节点所在的层数?
void traverse(TreeNode root, int level) {
    if(root == null) {
        return;
    }

    // 前序位置
    System.out.println("节点 " + root + " 在,第 " + level + " 层");

    traverse(root.left, level + 1);
    traverse(root.right, level + 1);
}

// 调用
traverse(root, 1);
  1. 如何打印每一个节点的左右子树各有多少节点?
int count(TreeNode root) {
    if(root == null) {
        return 0;
    }
	int leftCount = count(root.left);
	int rightCount = count(root.right);

	// 后序位置
	System.out.println(leftCount);
	System.out.println(rightCount);

	return leftCount + rightCount + 1;
}
  • a b两个问题的区别
  • 一个节点在第几层,从根节点遍历过来的时候就能够知道,因为遍历过程中就能顺带记录
  • 以一个节点为根的整颗子树有多少个节点,需要遍历完子树才能够清楚,通过递归函数的返回值拿到答案
  • 所以,面对问题的时候,要仔细分析问题解是否和子问题相关还是可以直接通过遍历得到结果

值得注意的点

  1. 如果可以,尽量使用没有返回值的函数作为递归函数
  1. 这样做会减少额外空间的使用
  1. 思考如何精简判断逻辑,会使代码变得更加简洁易懂

参考

https://labuladong.github.io/algo/di-ling-zh-bfe1b/dong-ge-da-334dd/

标签:知识点,遍历,后序,--,前序,零碎,二叉树,root,节点
From: https://blog.51cto.com/u_16079703/6318175

相关文章

  • 配置k8s的一个serviceaccount具有管理员权限并获取他的token
    创建sa账户/授定管理员角色权限cat>sa.yaml<<eofapiVersion:v1kind:ServiceAccountmetadata:name:kubepi-usernamespace:kube-systemeofcat>rolebe.yaml<<eofapiVersion:rbac.authorization.k8s.io/v1kind:ClusterRoleBindingmetadata:na......
  • 深度学习--调用chatgot接口实现
    首先,对于段落文字进行提取主要信息,第一反应要是电脑像人脑就行了,就想到chatgpt进行识别,以下为我识别的文字进行gpt转换。实验结果成立,现在只需要将接口调用,将识别文字传入后,进行字符串拼接,加上:“提取支付时间,消费类型,消费内容”,传入gpt后,将结果返回,输入到程序上,进行识别即可。......
  • Java 网络编程 —— 实现非阻塞式的客户端
    创建阻塞的EchoClient客户程序一般不需要同时建立与服务器的多个连接,因此用一个线程,按照阻塞模式运行就能满足需求publicclassEchoClient{privateSocketChannelsocketChannel=null;publicEchoClient()throwsIOException{socketChannel......
  • redis-cli 使用lua脚本笔记
    前言众所周知,redis可以执行lua脚本,至于为什么要用lua脚本来操作redis,自行百度咯先来讲一下最简单的方式,关于如何在javaspringboot里用lua脚本,请查看我另一篇文章:https://www.cnblogs.com/daen/p/17418024.html更为详细的资料请参考以下文章https://blog.csdn.net/jiayibingd......
  • git命令
    git命令1.常用命令gitclone+要拉取的代码地址gitpulloriginmaster同步主分支gitlog查看loggitinit构建本地仓库gitstatus查看仓库状态gitadd文件将修改的内容添加到暂存区gitcommit-m+修改日志将修改的内容提交到仓库gitpush推送到......
  • 线性dp
    P1725琪露诺一道线性dp的题目状态设置:f[i]:表示到达位置i时的最大价值状态转移:f[i]=max(f[i],f[j]+a[i])(i-r=<j<=i-l)这样做显然枚举状态是O(n)转移也需要O(n),所以时间复杂度是O(n^2)的显然会T状态我们是一定要枚举的,我们能优化的只有转移的计算量,我们需要快速找到......
  • Set集合
    set集合一直以来,JS只能使用数组和对象来保存多个数据,缺乏像其他语言那样拥有丰富的集合类型。因此,ES6新增了两种集合类型(set和map),用于在不同的场景中发挥作用。set用于存放不重复的数据如何创建set集合newSet();//创建一个没有任何内容的set集合newSet(iterable);......
  • 光谱仪DIY制作
    一、光谱仪理论概览    光谱仪是一种用来测量光线中光学成分的仪器。它能够用来帮助科学家分析物质材料中的基本成份,或者也可以用来分析来自于远距离恒星、行星发出的光谱。    光谱仪的基本概念在于通过捕捉一束狭缝当中的未知波长光束,由于光束中不同波长的光束通过......
  • synchronized原理
    `synchronized`是Java中用来实现线程同步的关键字,它的主要作用是对代码块或方法进行加锁,保证在同一时刻只有一个线程能够执行被加锁的代码块或方法,从而避免多个线程同时访问共享资源导致的数据不一致问题。`synchronized`的实现原理是基于Java对象头中的monitor(监视器)实......
  • 2023.5.20
    今天学习了yolov5技术,但是配置还没弄好。哎。具体学习连接:yolov5环境准备  ......