首页 > 其他分享 >二叉树的中序遍历(递归/栈)

二叉树的中序遍历(递归/栈)

时间:2024-12-23 19:09:31浏览次数:3  
标签:遍历 TreeNode 中序 right 二叉树 root 节点 left

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

 

示例 1:

输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

方法1:递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> res;
    vector<int> inorderTraversal(TreeNode* root) {
        if(root){
            inorderTraversal(root->left);
            res.emplace_back(root->val);
            inorderTraversal(root->right);
        }
        return res;
    }
};

 

方法2:借助栈的迭代方法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;  // 存储遍历结果的容器
        stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式中序遍历
        // 当前节点非空 或者 栈不为空时继续循环
        while (!stk.empty() || root) {
            // 尽可能地遍历到最左边的节点,同时将沿途的所有节点压入栈中
            while (root != nullptr) {
                stk.push(root);
                root = root->left;
            }
            // 此时root为nullptr,表示已经到达最左端
            // 弹出栈顶元素(即当前子树的根节点),并访问它
            root = stk.top();
            res.emplace_back(root->val); // 将访问的节点值添加到结果列表中
            
            // 移动到右子树,开始处理右子树中的节点
            root = root->right;
            stk.pop(); // 弹出已访问的节点
        }
        return res; // 返回最终的遍历结果
    }
};

拓展:

二叉树的前序遍历(借助栈的迭代方法)

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;  // 存储遍历结果的容器
        stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式前序遍历
        // 当前节点非空 或者 栈不为空时继续循环
        while (!stk.empty() || root) {
            while (root != nullptr) {
                //前序遍历根节点直接存放
                res.emplace_back(root->val);
                stk.push(root);
                root = root->left;
            }
            // 此时root为nullptr,表示已经到达最左端
            // 从栈顶节点的右节点开始处理右子树中的节点
            root = stk.top()->right;
            stk.pop(); 
        }
        return res; // 返回最终的遍历结果
    }
};

二叉树的后序遍历(借助栈的迭代方法)

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;  // 存储遍历结果的容器
        stack<TreeNode*> stk; // 辅助栈,用于存储节点以实现迭代式前序遍历
        // 当前节点非空 或者 栈不为空时继续循环
        while (!stk.empty() || root) {
            while (root != nullptr) {
                //前序遍历根节点直接存放
                res.emplace_back(root->val);
                stk.push(root);
                root = root->left;
            }
            // 此时root为nullptr,表示已经到达最左端
            // 从栈顶节点的右节点开始处理右子树中的节点
            root = stk.top()->right;
            stk.pop(); 
        }
        reverse(res.begin(),res.end()); // 取反即为后序遍历结果
        return res;
    }
};

 

标签:遍历,TreeNode,中序,right,二叉树,root,节点,left
From: https://www.cnblogs.com/yueshengd/p/18624837

相关文章

  • Java:为什么容器接口中定义的clear()方法具体实现要遍历每个元素并将其设置为null,而不
    以ArrayList为例,其clear()的具体实现为遍历每一个元素,并将其设置为null。publicvoidclear(){modCount++;finalObject[]es=elementData;for(intto=size,i=size=0;i<to;i++)es[i]=null;}笔者作为初学者,很难不产生疑惑,为什么不将s......
  • 【102. 二叉树的层序遍历 中等】
    题目:给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例2:输入:root=[1]输出:[[1]]示例3:输入:root=[]输出:[]提示:树中节点数目在范围[0,2000]内-10......
  • Golang中的Map是怎么遍历的
    在Golang中,遍历map的常见方法是使用for...range循环。map是无序的键值对集合,因此遍历map时,每次迭代访问的键值对顺序可能不同。以下是一个遍历map的示例:packagemainimport"fmt"funcmain(){//创建一个mapmyMap:=map[string]int{"ap......
  • 101.对称二叉树
    varisSymmetric=function(root){if(!root)returntrue;returnisMirror(root.left,root.right);};functionisMirror(left,right){if(!left&&!right)returntrue;if(!left||!right)returnfalse;if(left.val!==right.val)......
  • 12.16 二叉树的题目用acm模式 leetcode
    任务有leetcode1.将所有二叉树的题目用acm模式进行补充(完成了)github上面的所有二叉树ACM答案,模板https://github.com/PUNKDONG/leetcode/tree/master/src/treenodepackagetreenode;importjava.util.*;publicclasstreecode0_template{staticclassTreeNo......
  • 二叉树的代码实现
    main.c:tree.c:创建根,前序遍历,中序遍历,后序遍历,层序遍历,树的广度,树的深度,释放tree.h:queue.h:队列的代码实现:队列的实现-CSDN博客......
  • 数据结构-树(二叉树)
    在了解树具体的代码实现之前,先了解一下树的基础知识:根节点:第一个结点;叶子节点(终端节点):之后再没有其它结点的结点;分支节点(非终端节点):之后还有其它结点的结点;深度:即树的层数;(广)度:最大的节点的度;节点的度:节点的子节点个数这里主要介绍二叉树,即度为二,区分左右子节点的树结构。......
  • 【LC】104. 二叉树的最大深度
    题目描述:给定一个二叉树 root ,返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。示例1:输入:root=[3,9,20,null,null,15,7]输出:3示例2:输入:root=[1,null,2]输出:2提示:树中节点的数量在 [0,104] 区间内。-100<=No......
  • 每日一道算法题之宽度优先遍历之地图分析
    classSolution{publicintmaxDistance(int[][]grid){//思路:宽度优先遍历。//第一层有一个或者多个。单源+多源。//遍历到每一层的时候,看当前层有多少个数,然后就操作多少次。intm=grid.length;intn=grid[0].len......
  • 二叉树中和为某一值的路径 剑指offer
    题目描述        输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。        二叉树节点的定义如下:题目分析                分析完前面具体的例子......