由于本人基础较差,所以针对部分题型做一个记录,以免自己忘记

1、二叉树中序遍历

这个遍历方法可以搜一下博客上很多讲解,这里主要是记录一下代码实现,以下面的二叉树为例子

结果应该是

2、迭代法

2.1 遍历过程

这里借用了一个临时的栈(先访问的后处理),存储对应的根节点以及左子树对应的节点,整个过程基本上是不断访问子树(先左,后根,然后右),将根节点推入栈,当访问到最后一个根节点的左子树节点为空时,从栈顶取出对应元素,再访问其右子树节点,判断其是否有左右子树再进行操作。

  1. 从根节点(23)开始,curr开始指向原始根节点

  2. 指向根节点元素(23)压入栈中(根节点往往后面才会处理,所以我们先将其放入栈底)

  3. 找到当前节点的左子树节点(34),curr=curr.left

  4. 当前移动后的curr(指向34)不为空的话,则将其推入栈中

  5. 继续找当前节点(34)的左子节点(方法同上一个节点,若不为空则推入栈中)

  6. 直到左子树节点为空(即图示所示77对应的节点左子节点为空),取对应栈顶元素
    此时说明该节点无左子树,根据中序遍历左跟右的顺序,左子树为空,此时应该读取根节点元素(即取出对应的栈顶元素),这里77即为我们中序遍历的第一个节点

  7. 访问77对应右子树节点
    为空则说明这个节点对应无右子树,那么也就不用访问其对应右节点

    至此,以77为根节点的左子树访问完毕

  8. 访问以77作为左子节点的根节点99(从栈中取出对应根节点,栈顶元素99)
    访问完栈顶元素以后,一定紧接着访问右子树

  9. 访问以99为根节点的右子树,若其不为空,则压入栈中作为右子树的根节点

  10. 查询以90为根节点的右子树是否有左子节点

    如果以90为根节点的右子树有左子节点,那么方法同上,依次访问下去
    如果没有左子节点,那么取出栈中的90这个根节点

  11. 查询以90为根节点的子树是否有右子树

    此时以90为根节点的子树右子树节点为空,那么接下来进一步访问栈中所存的对应根节点元素

  12. 继续读取栈顶元素(此时对应34)

    此时,以34为根节点的左子树我们已经处理完毕了,34这个根节点也读取了,那么接下来处理34对应的右子树。

  13. 读取以34为根节点的右子树
    以34为根节点的右子树为空,那么以34为根节点的子树遍历完毕

    接下来继续处理栈中元素

  14. 继续读取栈中元素(此时为23)

    此时,整颗二叉树的左子树都遍历完成,接下来遍历对应的右子树

  15. 遍历右子树根节点(根节点为23对应右子树根节点不为空,可继续遍历,先遍历第一个根节点21,并且压入栈中)

  16. 继续先遍历以21为根节点的左子树,不为空则继续压入栈中(45)

  17. 继续左移,直到有一个左子树为空
    指向为空时(45的左子节点),开始处理栈顶元素,读取栈顶元素

  18. 查询以45为根节点的左子树是否有右子节点
    若有则推入栈中,查询接下来是否有左子节点
    若无则说明以45为根节点的子树访问完毕,接下来继续处理栈顶元素

  19. 观察以21为根节点的右子树情况,curr=curr.right

    右子树根节点不为空(60),则推入栈中

  20. 观察以60为根节点的右子树是否还有左右节点
    若有左子节点则继续遍历
    若无左子节点则取出栈顶元素(60),开始遍历右子树。
    若右子节点不为空,则推入栈中继续遍历
    若右子节点为空,且栈为空时,则整个中序遍历结束

2.2 代码实现

代码前面的说明直接拷贝了力扣的内容,函数的主要思想是
从根节点遍历二叉树,如果根节点为空,则直接返回空list
接下来是正常流程(整个流程走完同上面的遍历过程)

  1. 新建两个list,一个作为栈存储栈顶元素,一个存储最终的遍历结果
  2. curr开始指向根节点
  3. 遍历的结束条件是当前指针为空并且栈中没有元素(这里的while循环条件)
  4. 将根节点推入栈中,节点指针左移
  5. 当左移后的节点指针为空时,说明以该节点为根节点的子树无左子节点,遍历顺序为左根右,那么左为空,中序遍历则直接读取其栈顶元素(根节点的值),指针也指向该根节点,跳出第二个while循环。
  6. 查询以上一步中为根节点为子树的右子节点,移动指针,继续重复上述遍历(进到第一个while循环)
  7. 直至指针指向为空,且栈中无元素时,结束中序遍历

2.2.1 python

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):def inorderTraversal(self, root):""":type root: TreeNode:rtype: List[int]"""if not root:return []res, stack = list(), list()curr = rootwhile curr or len(stack): # 指针为空且栈中元素为空时结束循环while curr: # 当前指针不为空,推入根节点stack.append(curr)curr = curr.left# 左子节点为空,则读取栈顶元素对应的根节点node = stack.pop()res.append(node.val)# 读取右子树curr = node.rightreturn res

这里给的用例是
输入:[1,null,2,3]
输出:[1,3,2]
这里我打印了最初的根节点:
(TreeNode{val: 1, left: None, right: TreeNode{val: 2, left: TreeNode{val: 3, left: None, right: None}, right: None}}, 'root')

2.2.2 JavaScript

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number[]}*/
var inorderTraversal = function(root) {if (!root) return []const stack = [], res = []let curr = rootlet nodewhile (!(!stack.length && !curr)) { // 指针为空且栈中无元素时,结束循环// while (stack.length || curr) {while (curr) { // 指针不为空stack.push(curr)curr = curr.left}node = stack.pop()res.push(node.val)curr = node.right}return res
};

3、递归法

3.1 遍历过程

  1. 拆分二叉树

    主要思想是将一个完整的二叉树,分成左子树、根节点、右子树

    进一步继续拆分

    当最左边的左子树其左子节点为空则结束递归

  2. 进一步从最小的子树依次访问

  3. 依次进行遍历

    中序遍历=中序遍历左子树+根节点+中序遍历右子树

3.2 代码实现

/*** Definition for a binary tree node.* function TreeNode(val, left, right) {*     this.val = (val===undefined ? 0 : val)*     this.left = (left===undefined ? null : left)*     this.right = (right===undefined ? null : right)* }*/
/*** @param {TreeNode} root* @return {number[]}*/
var inorderTraversal = function(root) {if (!root) return []const inorder = (node, res) => {if (!node) returninorder(node.left, res)res.push(node.val)inorder(node.right, res)}const res = []inorder(root, res)return res
};

参考链接

力扣讲解

基本题型记录-二叉树中序遍历相关推荐

  1. 二叉树中序遍历(递归法和迭代法(非递归法))——C++

    声明:本文原题主要来自力扣,记录此博客主要是为自己学习总结,不做任何商业等活动! 二叉树的遍历有前序遍历.中序遍历.后序遍历和层次遍历,其中二叉树基本知识点可以参考博主上篇博客(二叉树基本知识点图文介 ...

  2. leetcode算法题--二叉树中序遍历迭代法

    原题链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/ 二叉树中序遍历迭代法,栈实现 vector<int> ...

  3. C++ morris inorder二叉树中序遍历(附完整源码)

    C++ morris inorder二叉树中序遍历 morris inorder二叉树中序遍历算法的完整源码(定义,实现,main函数测试) morris inorder二叉树中序遍历算法的完整源码( ...

  4. 初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为

    初始序列为1 8 6 2 5 4 7 3一组数采用堆排序,当建堆(小根堆)完毕时,堆所对应的二叉树中序遍历序列为:() 8 3 2 5 1 6 4 7 3 2 8 5 1 4 6 7 3 8 2 5 ...

  5. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点

    [LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 8 二叉树中序遍历的下一个结点 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注 ...

  6. 华为机试:二叉树中序遍历

    题目来源 华为机试:二叉树中序遍历 题目描述 题目解析 思路 class Solution{struct TreeNode{char ch;TreeNode *left;TreeNode *right ...

  7. 不用栈的二叉树中序遍历

    不用栈的二叉树中序遍历 // 中序遍历非栈非递归 void inOrder_noRecursion_noStack(TreeNode* r, char* pattern) {TreeNode* cur ...

  8. 二叉树中序遍历线索化 C++ 递归实现

    二叉树中序遍历线索化 中序遍历有一个特点,只要不是叶子节点,遍历的时候左孩子一定是当前节点的上一个访问节点:右孩子一定是当前节点的下一个访问节点. 如果把叶子节点的左右孩子都利用起来,把空的左孩子做成 ...

  9. 二叉树中序遍历线索化

    #include<stdio.h>typedef struct ThreadNode{int data;struct ThreadNode *lchild,*rchild;int ltag ...

最新文章

  1. rmd文件怎么转换html文件,提取.Rmd文件的html依赖项(包含htmlwidgets)
  2. php 字符串替换函数,php字符串替换函数str-replace速度比preg-replace快
  3. OpenGL point shadow点阴影的实例
  4. Spring Bean的装配(非XML文件方式)
  5. 谈谈Java基础数据类型
  6. [原创]简单即是美:QQ2009英文版
  7. Spring Boot 前端传json数组,后台接收处理
  8. python爬虫Day1(requests基本使用)
  9. 防淘宝关闭二维码案例
  10. 黑丝YYDS,通过五十行代码分分钟下载上万张黑丝小姐姐纯欲高清图!(宅男福利)
  11. 超详细的Redis入门教程
  12. 反编译获取任何微信小程序源码
  13. 9N90-ASEMI的MOS管9N90
  14. logo设计的基础知识
  15. MySQL中 修改语句使用的关键字是什么_表示修改一个数据库对象的SQL关键字是什么...
  16. 采坑系列:Waves MaxxAudio Pro无法正常启动,插入耳机窗口闪过,耳机没声音
  17. Kafka命令行常用命令说明
  18. linux amd显卡双屏,显示器的合理利用 ati显卡双屏详细设置【图文】
  19. 《Effective Modern C++》学习笔记之条款二十五:针对右值引用实施std::move,针对万能引用实施std::forward
  20. 为什么要学量化,因为证券的黄金十年要来了

热门文章

  1. java object比较排序
  2. 仿腾讯QQ竖直滑动导航菜单
  3. 一切照旧... ...
  4. 一款在线免费的甘特图,让你轻松管理项目进度
  5. 试用一片3-8译码器74LS138和其它必要的门电路设计一个一位全加器, 被加数为Ai, 加数为Bi, 低位来的进位为Ci-1, 本位和为Si, 本位对高位的进位为Ci
  6. Linux命令手动清除缓存
  7. 技术管理规划-如何设定团队的目标
  8. 一起智慧课堂_聚焦课堂,提升质量——六盘水市钟山区第一小学“智慧”课堂校际交流活动...
  9. bmp180气压传感器工作原理_40张动图看懂各种传感器工作原理
  10. Proteus的安装和介绍及51单片机电路仿真