首页 > 其他分享 >二叉树-迭代遍历

二叉树-迭代遍历

时间:2024-04-07 11:02:16浏览次数:25  
标签:node 遍历 cur 迭代 st result root 二叉树

递归的实现是每次递归调用都把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候就从栈顶弹出上一次递归的各项参数。可利用栈实现二叉树的前中后序遍历。

前序遍历

前序遍历是中左右的顺序,整体过程就是逐次访问父节点,压入右孩子再压入左孩子,由于访问的节点和待处理的节点顺序一致,故每次访问栈顶元素并将其存入结果集即可。

class Solution{
public:
  vector<int> preorderTraversal(TreeNode* root){
    vector<int> result;
    stack(TreeNode*) st;
    TreeNode* node = root;
    //判断是否为空树
    if(root == NULL) return result;
    st.push(root);
    while(!st.empty()){
      node = st.top();
      st.pop();
      result.push_back(node->val);
      //压入右孩子
      if(node->right) st.push(node->right);
      //压入左孩子
      if(node->left) st.push(node->left);   
    }
    return result;
  }
};

中序遍历

对于前序遍历,要访问的元素和处理的元素都是一致的。中序遍历则是由根节点一层一层向下访问直到树的最左边的叶子节点,再开始处理节点,这造成处理顺序和访问顺序的不一致。我们可借用指针来访问节点,利用栈来处理节点上的元素。
整体过程是从根节点逐次访问到最左边的叶子节点,并在栈中保存访问的节点路径,然后取栈顶元素将其存入到结果集中,并转向栈顶元素的右子树中。在右子树中仍然进行相同的操作。

class Solution{
public:
  vector<int> inorderTraversal(TreeNode* root){
    vector<int> result;
    stack(TreeNode*) st;
    //判断是否为空树
    if(root == NULL) return result;
    TreeNode* cur = root;
    while(cur != NULL || !st.empty()){
      //栈用以记录访问路径,记录最左边的路径
      if(cur!=NULL){
        st.push(cur);
        cur=cur->left;
      }else{
      // 逐次回退并记录节点元素值,若存在右子树则进入右子树:再执行同样的访问路径记录以及元素值记录和回退。
        cur = st.top();
        st.pop();
        result.push_back(cur->val);
        cur = cur->right;
      }
    return result;
  }
};

后序遍历

后序遍历可以仿照前序遍历去写,前序遍历是中左右,只需要按照中右左去遍历树然后逆序输出遍历结果即可得到左右中的后序遍历结果。

class Solution{
public:
  vector<int> postorderTraversal(TreeNode* root){
    vector<int> result;
    stack(TreeNode*) st;
    //判断是否为空树
    if(root == NULL) return result;
    st.push(root);
    //中右左遍历树
    while(!st.empty()){
      TreeNode* node = st.top();
      st.pop();
      result.push_back(node->val);
      //压入左孩子
      if(node->left) st.push(node->left);
      //压入右孩子
      if(node->right) st.push(node->right);
    }
    reverse(result.begin(),result.end());
    return result;
  }
};

标签:node,遍历,cur,迭代,st,result,root,二叉树
From: https://www.cnblogs.com/perngfey-note/p/18118442

相关文章

  • 2.手写JavaScript广度和深度优先遍历二叉树
    一、核心思想:1.深度遍历:依靠栈先进后出的机制,分别设置返回结果的数组和栈数组,首先判断栈非空,对每个结点,将其出栈并把值push到结果数组,判断是否有右左孩子,分别将其加入栈中,循环执行上述操作。否则返回结果数组。2.广度遍历:依靠队列先进先出的机制,分别设置返回结果的数组和队......
  • 迭代方法代替卷积来构造相位差
         在生成蓝牙GFSK信号时,GFSK滤波器的FPGA实现,传统的实现方法需消耗DSP,用迭代计算替代卷积运算,能实现LUT资源替代DSP资源,进而节约DSP。下面介绍其步骤:1、原始公式。其中x(n)为输入信号、h(n)为高斯整形滤波器,y(n)为输出信号。2、假设初始条件(为了调制从已知情......
  • 17天【代码随想录算法训练营34期】第六章 二叉树part04(● 110.平衡二叉树 ● 257.
    110.平衡二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgetDepth(self,root):......
  • 101. 对称二叉树
    兄弟们今天又来刷题了,题目:.-力扣(LeetCode)刚开始看到这个题其实就觉得和那个判断二叉树是否相等的题很相似,于是就照着那题的思路想,可是后来发现此题给的接口函数只有一个参数,没办法写,于是我们可以自己写一个接口函数来完成。思路:我们可以将这棵树看成把根节点删除的左右......
  • 二叉树-递归遍历
    深度优先遍历先往深走,遇到叶子结点再往回走,分为前序遍历,中序遍历和后序遍历。方法有递归法和迭代法。前中后序遍历,指的是中间节点的遍历顺序。前序遍历:5412678中左右中序遍历:1425768左中右后序遍历:1247865左右中深度优先遍历可利用递归法或者迭代法实......
  • 16天【代码随想录算法训练营34期】第六章 二叉树part03(● 104.二叉树的最大深度 559
    104.二叉树的最大深度#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defmaxDepth(self,root:O......
  • LC 226.翻转二叉树
    226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。示例1:输入:root=[4,2,7,1,3,6,9]输出:[4,7,2,9,6,3,1]示例2:输入:root=[2,1,3]输出:[2,3,1]示例3:输入:root=[]输出:[]提示:树中节点数目范围在[0,100]内......
  • 代码随想录算法训练营DAY18|C++二叉树Part.5|513.找树左下角的值、112. 路径总和、113
    文章目录513.找树左下角的值层序-迭代遍历前中后序-递归遍历思路伪代码CPP代码112.路径总和、113.路径总和II112.路径总和思路伪代码实现CPP代码113.路径总和II思路伪代码实现CPP代码实现106\105.从中(前)序与后(中)序遍历序列构造二叉树106.从中序与后序遍历序列......
  • Python面试必备一之迭代器、生成器、浅拷贝、深拷贝
    本文首发于公众号:Hunter后端原文链接:Python面试必备一之迭代器、生成器、浅拷贝、深拷贝这一篇笔记主要介绍Python面试过程中常被问到的一些问题,比如:Python中的迭代器和生成器是什么,有什么作用Python中不可变类型有哪些在Python函数中,传递参数传递的是什么,值还是引......
  • 数据结构 第五章(树和二叉树)【下】
    写在前面:本系列笔记主要以《数据结构(C语言版)》为参考(本章部分图片以及知识点整理来源于王道),结合下方视频教程对数据结构的相关知识点进行梳理。所有代码块使用的都是C语言,如有错误欢迎指出。视频链接:第01周a--前言_哔哩哔哩_bilibili哈夫曼树部分的代码参考了一位小伙伴分享的......