首页 > 编程语言 >代码随想录算法训练营第十四天 | 二叉树理论基础,递归遍历,分别迭代遍历, 统一迭代遍历

代码随想录算法训练营第十四天 | 二叉树理论基础,递归遍历,分别迭代遍历, 统一迭代遍历

时间:2023-12-26 23:00:34浏览次数:40  
标签:结点 遍历 迭代 前序 第十四天 二叉树 取值

一、二叉树理论基础

学习:

1. 从二叉树是否包含数值进行分类:

  • 无数值:完全二叉树和满二叉树

  • 有数值的:二叉搜索树和平衡二叉搜索树(AVL,Adelson-Velsky and Landis)。其中二叉搜索树指数值按照从小到大的顺序是左子树<根结点<右子树,平衡指的是左右子树高度差不超过1

2. 二叉树存储方式

  • 链式存储:通常采用的存储方式
  • 顺序存储:根结点的下标为i,则左孩子为2i+1,右孩子为2i+2

3. 二叉树遍历

  • 深度优先遍历----发展出前序遍历、中序遍历、后序遍历,其中方位指的是根结点遍历的顺序

  • 广度优先遍历----层序遍历

二、对三种遍历顺序的两种遍历方式

题目链接:

LeetCode 144. 二叉树的前序遍历

LeetCode 94. 二叉树的中序遍历

LeetCode 145. 二叉树的后序遍历

1. 递归遍历

递归调用的主函数是一样的,具体递归过程中递归参数和返回值、终止条件是一样的,只有单次循环内容的根结点、左孩子、右孩子的顺序不一样

  • 前序遍历:根左右
  • 中序遍历:左根右
  • 后序遍历:左右根

2. 分别迭代遍历

用栈来存储结点,其中只有前序遍历是使得遍历结点和取值结点保持一致的,后序结点可以是前序结点调整顺序后遍历结果的翻转

  • 前序遍历:弹出栈顶结点并取值,然后若存在则将右孩子和左孩子依次入栈
  • 中序遍历:需要指针,指向要取值的结点。指针非空时,入栈然后指向当前结点的左孩子;指针为空时,返回根结点即栈顶元素,取值然后指向当前结点的右孩子
  • 后序遍历:与前序类似,弹出栈顶结点并取值,然后若存在则将左孩子和右孩子依次入栈,最后翻转

3. 统一迭代遍历

核心思路为添加标记符,即标记这个结点的左右孩子若存在已入栈,这样解决了中序和后序重复添加结点的问题

五、学习总结

  1. 时间:4h

  2. 掌握了递归三步法

  3. 掌握了迭代遍历,以及统一迭代遍历

    • 分别迭代会产生当前元素和取值元素不一致且重复添加孩子结点的问题
    • 统一迭代对当前结点进行标记,当遇到标记时,才取值并出栈,使得两类元素变成一致,并且不会重复添加

标签:结点,遍历,迭代,前序,第十四天,二叉树,取值
From: https://www.cnblogs.com/amulet/p/17929570.html

相关文章

  • 40.Android fastbot遍历测试工具
    Fastbot介绍基于model-basedtesting结合机器学习、强化学习的APP稳定性测试工具Fastbotisamodel-basedtestingtoolformodelingGUItransitionstodiscoverappstabilityproblems.Itcombinesmachinelearningandreinforcementlearningtechniquesto......
  • 39.android maxim 遍历测试工具
    maxim介绍 AnefficientAndroidMonkeyTester,availableforemulatorsandrealdevices基于遍历规则的高性能AndroidMonkey,适用于真机/模拟器的APPUI压力测试maximquickstart cdMaximadbpushframework.jar/sdcardadbpushmonkey.jar/sdca......
  • 38.自动化遍历测试技术
    自动化测试与手工测试对比  手工测试自动化测试业务覆盖度低高❤️执行速度低高❤️维护成本低❤️高学习成本低❤️高{style=“margin:auto”}手工测试的困境 测试广度回归测试难以保证,测试内容太多导致手工测试无法充分覆盖兼容性......
  • 迭代器模式揭秘:如何优雅应对数据遍历
    推荐语在这篇文章中,深入探讨了迭代器模式的核心原理和实战应用。通过清晰而有条理的解释,读者小伙伴可以领悟到迭代器模式在数据遍历和管理方面的强大能力。无论是初学者还是有经验的开发者,都能从这篇文章中获得实用的知识和技巧,进一步提升代码的可读性和可维护性。什么是迭代器模......
  • 函数的递归和迭代
    我们学习函数递归和迭代往往需要掌握许多的数学规律,公式定律,下面我们通过两个递归,迭代相关的经典例题来了解递归和迭代的思想。今天的主角是我们的汉诺塔和青蛙跳台阶。(1)汉诺塔:相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),......
  • 给出中序和按层遍历,求该树的先序遍历,后序遍历,叶子结点。
    一切的核心是怎么利用中序和按层遍历构建二叉树?1.优化空间很大,可以提前预处理记录每个数对应的位置,还可以vis数组记录这个点是不是已经作为根了。2.我们考虑到每次找到当前中序要处理区间,里面的数记为集合mid,我们从前到后看层序遍历中的哪个数最先出现在mid中。那么这个数就是当......
  • 二叉树给出先序和中序遍历序列,求和树 要求输出中序遍历序列;
    1.就算不知道用vector的初始化,也可以手动赋值创建子数组。2.不断找到当前序列对应的根节点,计算他的子节点的总和,在这样递归处理过程中,注意要中序输出,所以对于是先遍历完左子树,然后输出答案,然后遍历右子树#include<bits/stdc++.h>usingnamespacestd;#definelllonglong//......
  • re | 通过PEB遍历进程模块
    re|通过PEB遍历进程模块最近在设计实验,重新写一些代码存一下:使用vc6编译通过。比较好的参考文章:https://www.cnblogs.com/bokernb/p/6404795.html#include<stdio.h>#include<windows.h>/*typedefstruct_LIST_ENTRY{struct_LIST_ENTRY*Flink;struct_LIST_......
  • 320二叉树的不同形态(已知层次遍历和中序遍历创建二叉树;输出叶子结点(从左到右);后序遍历)
    题目:二叉树的不同形态问题描述给定二叉树T(树深度H<=10,深度从1开始,结点个数N<1024,结点编号1~N)的层次遍历序列和中序遍历序列,输出T从左向右叶子结点以及二叉树先序和后序遍历序列。输入格式输入共三行:第一行是整数n,表示二叉树中的结点数目;第二行有n个整数,表示该二叉树的层次遍......
  • 318二叉树遍历
    1#include<stdio.h>2#include<string.h>3#include<stdlib.h>4typedefstructtreenode{5chardata;6structtreenode*lchild;7structtreenode*rchild;8}treenode,*tree;910treecreateTree(char*preorder,char......