首页 > 其他分享 >二叉树-统一迭代法

二叉树-统一迭代法

时间:2024-04-07 12:01:24浏览次数:20  
标签:result cur st 二叉树 push 迭代法 NULL 节点 统一

迭代法实现的前中后序遍历,除了前序和后序相互关联,中序则是另一种风格。我们需要针对三种遍历方式实现统一风格的代码。如何统一风格:解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。将访问的节点放入栈中,把要处理的节点放入栈中但是做标记(紧接着放入一个空指针)。

统一迭代-中序遍历

class Solution{
public:
  vector<int> inorderTraversal(TreeNode* root){
    vector<int> result;
    satck(TreeNode*) st;
    //判断是否为空树
    if(root == NULL) return result;
    st.push(root);
    while(!st.empty()){
      TreeNode* cur = st.top();
      if(cur != NULL){
        st.pop();//弹出该节点避免重复压入栈,下面将右中左压入栈中
        if(cur->right) st.push(cur->right);
        //中节点访问过但是未处理,添加空节点做标记
        st.push(cur);
        st.push(NULL);

        if(cur->left) st.push(cur->left);
      }else{//遇到空节点则将栈内下一个节点放入结果集
        st.pop(); //删除栈内空节点
        cur = st.top();
        st.pop();//删除栈内处理的节点
        result.push_back(cur->val);
      }
    }
  return result;
  }
};

统一迭代-前序遍历

class Solution{
public:
  vector<int> inorderTraversal(TreeNode* root){
    vector<int> result;
    satck(TreeNode*) st;
    //判断是否为空树
    if(root == NULL) return result;
    st.push(root);
    while(!st.empty()){
      TreeNode* cur = st.top();
      if(cur != NULL){
        st.pop();//弹出该节点避免重复压入栈,下面将右中左压入栈中
        if(cur->right) st.push(cur->right);
        if(cur->left) st.push(cur->left);
        //中节点访问过但是未处理,添加空节点做标记
        st.push(cur);
        st.push(NULL);
      }else{//遇到空节点则将栈内下一个节点放入结果集
        st.pop(); //删除栈内空节点
        cur = st.top();
        st.pop();//删除栈内处理的节点
        result.push_back(cur->val);
      }
    }
  return result;
  }
};

统一迭代-后序遍历

class Solution{
public:
  vector<int> inorderTraversal(TreeNode* root){
    vector<int> result;
    satck(TreeNode*) st;
    //判断是否为空树
    if(root == NULL) return result;
    st.push(root);
    while(!st.empty()){
      TreeNode* cur = st.top();
      if(cur != NULL){
        st.pop();//弹出该节点避免重复压入栈,下面将右中左压入栈中
        //中节点访问过但是未处理,添加空节点做标记
        st.push(cur);
        st.push(NULL);
        if(cur->right) st.push(cur->right);
        if(cur->left) st.push(cur->left);
      }else{//遇到空节点则将栈内下一个节点放入结果集
        st.pop(); //删除栈内空节点
        cur = st.top();
        st.pop();//删除栈内处理的节点
        result.push_back(cur->val);
      }
    }
  return result;
  }
};

访问是遍历节点,处理则是将元素放进结果集中,统一风格的迭代遍历实际上是利用NULL去标记处理的元素,然后逐次输出。

标签:result,cur,st,二叉树,push,迭代法,NULL,节点,统一
From: https://www.cnblogs.com/perngfey-note/p/18118786

相关文章

  • 18天【代码随想录算法训练营34期】● 513.找树左下角的值 ● 112. 路径总和 113.路径
    513.找树左下角的值#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:deffindBottomLeftValue(self......
  • 二叉树-迭代遍历
    递归的实现是每次递归调用都把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候就从栈顶弹出上一次递归的各项参数。可利用栈实现二叉树的前中后序遍历。前序遍历前序遍历是中左右的顺序,整体过程就是逐次访问父节点,压入右孩子再压入左孩子,由于访问的节点和待......
  • 2.手写JavaScript广度和深度优先遍历二叉树
    一、核心思想:1.深度遍历:依靠栈先进后出的机制,分别设置返回结果的数组和栈数组,首先判断栈非空,对每个结点,将其出栈并把值push到结果数组,判断是否有右左孩子,分别将其加入栈中,循环执行上述操作。否则返回结果数组。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.从中序与后序遍历序列......
  • 数据结构 第五章(树和二叉树)【下】
    写在前面:本系列笔记主要以《数据结构(C语言版)》为参考(本章部分图片以及知识点整理来源于王道),结合下方视频教程对数据结构的相关知识点进行梳理。所有代码块使用的都是C语言,如有错误欢迎指出。视频链接:第01周a--前言_哔哩哔哩_bilibili哈夫曼树部分的代码参考了一位小伙伴分享的......