首页 > 其他分享 >关于二叉树中三种深度遍历方式的理解

关于二叉树中三种深度遍历方式的理解

时间:2023-11-01 10:23:18浏览次数:96  
标签:遍历 递归 invertTree right 三种 二叉树 返回值 root left

今日刷题,538. 把二叉搜索树转换为累加树。明确知道利用二叉搜索树中序遍历的情况下是有序数组这一个特点,进行“逆中序”来累加。但是在递归时却还是有些没有搞清楚一些细节,终究还是没有掌握。

问题主要还是在于递归返回值的处理上:
在中序遍历的情况下,似乎对于左右两个节点的遍历,不太方便进行返回值的操作,因为中序在中间,若后面有返回值,那么处理逻辑又在哪呢,还有前序遍历似乎也是一样,逻辑处理已经在最前面进行了,那么你的后面的递归有返回值又该怎么去处理呢?但是也有一种情况,只是因为刷题过程中不想重新设计一个递归函数,如:

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == NULL) return root;
        swap(root->left, root->right);  // 中
        invertTree(root->left);         // 左
        invertTree(root->right);        // 右
        return root;
    }
};
// 这里是虽然有返回值但是实际上递归过程中是没有值来承接的。
// 实际上仍然可以看作没有返回值:
class Solution {
public:
    void invert(TreeNode* root) {
        if (root == nullptr) return;
        swap(root->left, root->right);
        invertTree(root->left);
        invertTree(root->right);
    }
    TreeNode* invertTree(TreeNode* root) {
        if (root == nullptr) return root;
        invert(root);
        return root;
    }
};

上述类型的题目不涉及修改二叉树的结构,只是涉及到正常的变换,所以没必要涉及返回值去承接什么,只是在递归过程中完成逻辑处理
还有一种情况是,需要构造,修改:
这种root->left和root->roght都需要承接逻辑处理之后产生的新的结构,所以是肯定需要返回值的,而且大概率还是这种:

root->left = 递归(root->left, ...);
root->right = 递归(root->right, ...);

> 以上只是我个人浅薄记录,欢迎批评指正。

标签:遍历,递归,invertTree,right,三种,二叉树,返回值,root,left
From: https://www.cnblogs.com/H-force/p/17802426.html

相关文章

  • 104.二叉树的最大深度
    目录题目法一、后序遍历法二、层序遍历题目给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2法一、后序遍历后序遍历......
  • [Leetcode] 0111. 二叉树的最小深度
    111.二叉树的最小深度题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。 示例1:输入:root=[3,9,20,null,null,15,7]输出:2示例2:输入:root=[2,null,3,null,4,null,5,null,6]输......
  • 代码随想录训练营第二十天打卡(Python)| 654.最大二叉树 、617.合并二叉树 、700.二叉搜
    654.最大二叉树1、使用切片classSolution:defconstructMaximumBinaryTree(self,nums:List[int])->Optional[TreeNode]:iflen(nums)==0:returnNonemax_val=max(nums)max_index=nums.index(max_val)node=T......
  • 代码随性训练营第十七天(Python)| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之
    110.平衡二叉树1、递归法classSolution:defisBalanced(self,root:Optional[TreeNode])->bool:ifself.get_height(root)!=-1:#-1代表高度差大于1returnTrueelse:returnFalsedefget_height(self,root):......
  • 二叉树概念和操作
    二叉树定义二叉树(BinaryTree)是n(n>=0)个结点所构成的集合,它或为空树(n=0);或为非空树,对于非空树$T$:有且仅有一个称之为根的结点除根节点以外的其余结点分为两个互不相交的子集$T_1$和$T_2$,分别称为$T$的左子树和右子树,且$T_1$和$T_2$本身又是二叉树二叉树性质及存储结构通过......
  • 平衡二叉树AVL
    在计算机科学中,AVL树是最早被发明的自平衡二叉查找树。在AVL树中,任一节点对应的两棵子树的最大高度差为1,因此它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是$O(logn)$。所以我们可知,AVL树首先是二叉查找树(BST),不了解BST的同学可以了解一下,因为AVL树......
  • 02Collection的遍历方式
    Collection的遍历方式遍历器遍历增强for循环遍历Lambda表达式遍历普通for只有List系列的才能用,Set用不了一、迭代器遍历iteratorn.迭代器,迭代程序。迭代器不依赖索引。迭代器遍历就是把元素一个一个的获取出来二、迭代器的Iterator类,和它的常用方法迭代器......
  • 03Collection的遍历方式二
    二、增强for遍历增强for的底层就是迭代器,为了简化迭代器的代码书写的。它是JDK5之后出现的,其内部原理就是一个Iterator迭代器所有的单列表集合和数组才能用增强for进行遍历格式:for(元素的数据类型变量名:数组或者集合){}for(Strings:list){System......
  • 【java基础-实战3】list遍历时删除元素的方法
    在实际的业务开发中,容器的遍历可以说是非常非常常见的场景了,遍历删除呢,用的机会也比较多,那么有哪几种删除元素的方法呢?你用对了吗~本文循序渐进,先说几种容易出问题的方法,再引出几种比较可靠的方法~首先,初始化一个数组,用于后面的事例演示:List<Integer>list=newArrayList<>();......
  • 算法:实现中序遍历(3种方法图例详解,小白也能看懂)
     中序遍历:左->中 ->右练习地址:力扣(LeetCode)官网-全球极客挚爱的技术成长平台1、递归法 #Definitionforabinarytreenode.classTreeNode(object):def__init__(self,val=0,left=None,right=None):self.val=valself.left=left......