首页 > 其他分享 >94. 二叉树的中序遍历

94. 二叉树的中序遍历

时间:2024-11-25 22:15:05浏览次数:5  
标签:inorderTraversal res 中序 st vector 二叉树 push root 94

问题描述

给定root,返回中序遍历,答案格式:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        
    }
};

则:

  1. 将vector作为static或者全局变量,可以在该函数中实现递归;
  2. 写另外一个函数专门用来递归;

法一、使用另外的递归函数

class Solution {
public:
    void solve(TreeNode* root, vector<int> &res)
    {
        if (root == nullptr) {
            return ;
        }
        solve(root->left, res);
        res.push_back(root->val);
        solve(root->right, res);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        solve(root, res);
        return res;
    }
};

法二、使用全局变量

class Solution {
public:
    vector<int> res;
    vector<int> inorderTraversal(TreeNode* root) {
        if (root == nullptr) {
            return res;
        }
        inorderTraversal(root->left);
        res.push_back(root->val);
        inorderTraversal(root->right);
        return res;
    }
};

如果使用static,且不用另外的递归函数,会导致下一个测试用例中带有本次测试用例的答案,从而只有第一个测试用例正确,错误代码如下:

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        static vector<int> res;
        if (root == nullptr) {
            return res;
        }
        inorderTraversal(root->left);
        res.push_back(root->val);
        inorderTraversal(root->right);
        return res;
    }
};

此外,可以使用递归,则也可以使用栈来解决。对于官方题解,比较麻烦,根据其他用户的题解,可以使用染色法,将未访问过的结点记为WHITE,访问过的结点记为GRAY,该方法容易实现,且可拓展性强,C++实现如下。

法三、栈+染色法

class Solution {
public:
    vector<int> res;
    vector<int> inorderTraversal(TreeNode* root) {
        const int GRAY = 1; // 已经访问过
        const int WHITE = 0;
        stack<pair<TreeNode*, int>> st;
        st.push(make_pair(root, WHITE));
        while(!st.empty()) {
            TreeNode* p = st.top().first;
            int status = st.top().second;
            st.pop();
            if (p == nullptr) {
                continue;
            }
            if (status == WHITE) {
                st.push(make_pair(p->right, WHITE));
                st.push(make_pair(p, GRAY));
                st.push(make_pair(p->left, WHITE));
            } else {
                res.push_back(p->val);
            }
        }
        return res;
    }
};

也可以利用该方法实现前序和后序遍历。

标签:inorderTraversal,res,中序,st,vector,二叉树,push,root,94
From: https://www.cnblogs.com/saulstavo/p/18568892

相关文章

  • 代码随想录算法训练营第十二天|二叉树理论基础|二叉树的递归遍历|二叉树的迭代遍历|二
    二叉树的理论基础二叉树的主要形式:        二叉树有两种主要的形式:满二叉树和完全二叉树;    满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。可以说深度为k,有2^k-1个节点的二叉树。       ......
  • 617. 合并二叉树 Golang实现
    题目描述:给你两棵二叉树:root1和root2。想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为null的节点将直接作......
  • 【题解】洛谷P11311、P2943: 漫长的小纸带、Cleaning Up G
    赛时不会去想dp,感觉没法转移,然后去写了贪心,然后直接假掉唐完了。为什么贪心不能做,因为多个数的话还是可能被减,\(3\)个数长度为\(11\)就可以变成\(9\),非常划算,好像很显然,但是为什么我赛时写了只会有长度\(2\)的区间唐完了。考虑dp,设\(f_i\)表示\(1-i\)的最小代价,枚举......
  • 科普文:软件架构之Linux系列【linux内核数据结构:链表、队列、映射、二叉树】
    概叙科普文:软件架构之Linux系列【linux内核数据结构汇总】-CSDN博客Linux内核提供了许多复杂的数据结构,这些结构被广泛用于各种不同的目的,例如存储设备管理、内存管理、进程管理等。以下是一些常见的数据结构以及它们的简要描述:双向链表(list):实现链表的数据结构,每个节点都......
  • 代码随想录算法训练营第十三天| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子
    110.平衡二叉树题目链接:.-力扣(LeetCode)文章链接:代码随想录视频链接:后序遍历求高度,高度判断是否平衡|LeetCode:110.平衡二叉树_哔哩哔哩_bilibili《代码随想录》算法公开课开讲啦!快来打卡!本期视频的文字讲解版在「代码随想录」刷题网站:programmercarl.com,这里刷题顺序,详......
  • 数据结构与算法——树与二叉树
    树与二叉树1.树的定义与相关概念树的示例:树的集合形式定义Tree=(K,R)元素集合:K={ki|0<=i<=n,n>=0,ki∈ElemType}(n为树中结点数,n=0则树为空,n>0则为非空树)对于一棵非空树,关系R满足下列条件:1.有且仅有一个结点没有前驱,称为根结点。2.处根结点外,其余每个结点有且仅有一个前......
  • 二叉树和度为二的有序树的区别
    一、定义与结构度为二的有序树:在这种树结构中,每个节点最多有两个子节点。子节点的顺序是重要的,即使两个子节点的值相同,只要他们的位置不同,他们就被视为是不同的子节点。当一个节点只有一个子节点时,该子节点的位置(左或右)并无特定要求,也即无需区分其左右次序。二叉树:二叉树......
  • 解锁二叉树的魅力:链式实现详解
    前言二叉树的简介及顺序实现引言在数据结构的浩瀚星空中,二叉树如同一颗璀璨的明珠,其优雅的结构和强大的功能使其成为计算机科学中不可或缺的工具。从数据库索引到编译器的语法树,二叉树以其独特的方式支撑着许多核心算法与数据处理。本文将深入探讨如何使用C语言实现二叉树的......
  • 二叉树的中序遍历
    给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]提示:树中节点数目在范围 [0,100] 内-100<=Node.val<=100进阶: 递归算法很简单,你可以通......
  • 知名服务-Samba服务漏东(CVE-2017-7494)
    Samba服务漏动原理说明CVE-2017-7494是一个Samba服务中的严重远程代码执行漏动,影响了Samba3.5.0至4.6.4/4.5.10/4.4.14之间未打补丁的版本。该漏动允许远程公鸡者在受影响的Samba服务器上执行任意代码,只要他们能够向SMB服务写入文件。公鸡者可以通过向Samba服务器上传一个特制的共......