Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >二叉树中迭代序遍历的空间复杂度是多少?

二叉树中迭代序遍历的空间复杂度是多少?
EN

Stack Overflow用户
提问于 2018-07-15 02:29:12
回答 2查看 3.6K关注 0票数 5

我一直在想,二叉树的迭代前置遍历(使用堆栈)的空间复杂度是多少。我参考了节目采访的内容,他们说

空间复杂度是O(h),其中h是树的高度,因为除了堆栈的顶部之外,堆栈中的节点对应于从根开始的路径上的节点的正确子节点。

以下是供参考的守则:

代码语言:javascript
运行
AI代码解释
复制
struct Node{
   int data;
   struct Node* left, right;
}
void printPreOrder(struct Node* root){
  if(!root)
   return ;
  stack<struct Node* > s;
  s.push(root);
  while(!s.empty()){
     struct Node *root_element = s.top();
     cout<<root_element->data<<" ";
     s.pop();
      if(root_element->right){
         s.push(root_element->right);
      }
      if(root_element->left){
         s.push(root_element->left);
      }
     }
     cout<<endl;
  }
  return ;
}

我的直觉

在研究该算法时,我观察到,在任何实例中,堆栈中的最大条目数可以是最大(num_of_leaves_in_left_subtree+1,num_of_trees_in_right_subtree)。由此可以推断,对于高度为h的树,最大叶数可为2^ h,因此,左子树中的最大树数为2^(h-1)。因此,堆栈中的最大条目数为2^(h-1)+1。因此,根据我的说法,上述算法的空间复杂度为O(2^(log(N)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-15 13:14:01

首先,您的preorder traversal迭代实现有一个错误--您应该推送一个右节点,然后再推一个左节点,反之亦然。

现在解释一下--在每次迭代中,您都要深入一个层次,并在堆栈中添加2个元素(如果它们存在的话),同时弹出一个节点(父节点)。这意味着,最多增加一个新的元素时,你去一个级别下降。一旦到达最左边的节点并弹出它,就会对堆栈-> O(h)中的顶部节点重复相同的过程。

例如,

代码语言:javascript
运行
AI代码解释
复制
      1
     / \
   2     5
  / \   / \
 3   4 6   7

步骤0:1被添加到堆栈-> O(1)中

步骤1:1删除,2和5被添加-> O(2)

步骤2:2删除,3和4被添加-> O(3)

步骤3:3删除-> O(2)

步骤4:4删除-> O(1)

步骤5:5删除,6和7被添加-> O(2)

步骤6:6删除-> O(1)

步骤7:7已删除-> O(0)

正如你所看到的,空间复杂性总是与树的高度成正比。

在最坏的情况下(如果树看起来像列表),空间复杂性是O(1) for --您的实现(正如@Islam Muhammad所指出的),因为在while循环的每一次迭代中,都会从堆栈中删除一项,并添加一项(只有1子项)。

票数 9
EN

Stack Overflow用户

发布于 2018-07-15 06:24:51

让我们按顺序遍历算法来找出它。

尝试观察根节点处的整个树所需的最大堆栈大小将等于添加了1的左侧子树所需的堆栈的最大大小。

但是怎么做?

如果您仔细观察,您会发现,当我们处理根节点时,我们将向堆栈中添加右节点和左节点,然后将堆栈的顶部,即左侧节点进行处理。

因此,如果递归地定义用于查找所需堆栈的最大大小的函数,则如下所示:

代码语言:javascript
运行
AI代码解释
复制
function maxStackSizeReq(struct Node* root){
 if(!root)
    return 0; 
 return maxStackSizeReq(node->left)+1;
}

现在解释一下--在每次迭代中,您都要深入一个层次,并在堆栈中添加2个元素(如果它们存在的话),同时弹出一个节点(父节点)。这意味着,最多增加一个新的元素时,你去一个级别下降。一旦到达最左边的节点并弹出它,就会对堆栈-> O(h)中的顶部节点重复相同的过程。

例如,让我们尝试找出以下树所需的最大堆栈大小。

代码语言:javascript
运行
AI代码解释
复制
     1
     / \
   2     5
  / \   / 
 3   4 6   

步骤0:调用maxStackSizeReq(root_1) ->返回maxStackSizeReq(root_2)+1这里的意思是,所需堆栈的最大大小将是左子树+1所需的堆栈大小。

代码语言:javascript
运行
AI代码解释
复制
  2  
 / \  
3   4

步骤2:调用maxStackSizeReq(root_2) - > return maxStackSizeReq(root_3)+1这里的意思是,所需堆栈的最大大小将是左子树+1. 3所需的堆栈大小。

步骤3:在这里调用maxStackSizeReq(root_3) - > return maxStackSizeReq(root_3->left which is NULL)+1我们的意思是,所需堆栈的最大大小将是左子树所需的堆栈大小,即NULL + 1。

因此,步骤3返回1 -> 步骤2返回2 -> 步骤1返回3;

最后,函数将返回3作为处理根节点树的预顺序遍历所需的最大堆栈大小。

时间复杂度O(h)如何?,如果你仔细遵循上面的算法,你也会发现我们只遍历树的左子树。因此,当执行O(h)递归调用时,上述算法的空间复杂度为O(h)。最后,预序迭代堆栈实现的空间复杂度也将是O(h)。

记住

有时,您可能会听到预序或无序迭代解的空间复杂性是O(n)。但是,请记住,O(h)是一个更好的答案,因为空间复杂度仅为O(n),当h变为n时,这是相当明显的。

代码语言:javascript
运行
AI代码解释
复制
1
 \
  2
   \
    3
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51347487

复制
相关文章
额外空间复杂度O(1) 的二叉树遍历 → Morris Traversal,你造吗?
二叉树的遍历 → 不用递归,还能遍历吗中讲到了二叉树的深度遍历的实现方式:递归、栈+迭代
青石路
2022/05/10
4940
额外空间复杂度O(1) 的二叉树遍历 → Morris Traversal,你造吗?
[数据结构] 二叉树的前序遍历、中序遍历和后序遍历
二叉树先序遍历 二叉树先序遍历的实现思想是: 访问根节点; 访问当前节点的左子树; 若当前节点无左子树,则访问当前节点的右子树; 二叉树中序遍历 二叉树中序遍历的实现思想是: 访问当前节点的左子树; 访问根节点; 访问当前节点的右子树; 二叉树后序遍历 二叉树后序遍历的实现思想是: 从根节点出发,依次遍历各节点的左右子树, 直到当前节点左右子树遍历完成后,才访问该节点元素。
泰坦HW
2020/07/22
1.4K0
[数据结构] 二叉树的前序遍历、中序遍历和后序遍历
空间复杂度
什么是空间复杂度 空间复杂度是指执行算法时所使用的临时变量所占用内存空间的大小,同时间复杂度一样用大写的字母O(数量)来表示。 为什么使用空间复杂度 用于判断算法的优劣(算法在时间复杂度相同的情况下,空间复杂度越小的越好) 常见的空间复杂度种类 常数空间:算法所占用的空间是固定的,与输入输出无关,记为S(n) = O(1)。 线性空间:算法所占用的空间与输入输出成正比,记为S(n) = O(n)。 二维空间:算法所分配的是一个集合长度和宽度都与输入规模成正比的二维数组,记为S(n) = O(n²)。 递归
longzeqiu
2020/02/18
4310
空间复杂度
什么是空间复杂度? 算法在运行过程中临时占用存储空间大小的度量,和时间复杂度表示一样,一个函数,用大 O 表示,例如 O (1)、O (n)、O (^2 )... 基础案例 O(1) 这段代码因为只声
菜园前端
2023/06/08
1510
时间复杂度中的log(n)底数到底是多少?
假设有底数为2和3的两个对数函数,如上图。当X取N(数据规模)时,求所对应的时间复杂度得比值,即对数函数对应的y值,用来衡量对数底数对时间复杂度的影响。
城市中的游牧民族
2019/02/21
2.9K0
时间复杂度中的log(n)底数到底是多少?
二叉树的先序遍历 中序遍历 后序遍历 层序遍历
完全二叉树: 完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。
小雨的分享社区
2022/10/26
1.1K0
二叉树的先序遍历 中序遍历 后序遍历 层序遍历
二叉树进行中序遍历的结果_层次遍历和中序遍历构建二叉树
方法:在二叉树下画一条线作为X轴,把所有节点投影到X轴上,从左到右排列好,得到的结果就是中序遍历的结果。
全栈程序员站长
2022/10/05
3840
二叉树进行中序遍历的结果_层次遍历和中序遍历构建二叉树
二叉树---(3)前序遍历,中序遍历,后序遍历
        很多朋友在刚开始接触二叉树时,对前序遍历,中序遍历,后序遍历这三个遍历方式不太了解,很多博客中,上来就是实现方式,并没有清晰的阐述这三种遍历的步骤和顺序,这里记录一下。
IT云清
2019/01/22
6920
LeetCode 94. 二叉树的中序遍历(中序遍历)
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2021/02/20
2980
LeetCode 94. 二叉树的中序遍历(中序遍历)
二叉树的中序遍历
每一次有新节点入栈,都会设置他的颜色为白色,目的是为了在该节点下次出栈的时候,查看其左右孩子是否存在,存在的话压入栈中,再设置为灰色,下一次出栈就直接输出
大忽悠爱学习
2021/11/15
1670
二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解
本文持续更新地址:https://haoqchen.site/2018/05/23/go-through-binary-tree/
全栈程序员站长
2022/07/01
2.5K0
二叉树前序遍历、中序遍历、后序遍历、层序遍历的直观理解
【时间复杂度空间复杂度】
当文件没有进行保存时,这个文件保留在内存中,一旦断电,文件将无法保存,因此为了避免这种情况的发生,,处理文件之后,应该及时的ctrl+s保存到磁盘当中去。
每天都要进步呀
2023/03/28
1.7K0
【时间复杂度空间复杂度】
算法的时间复杂度与空间复杂度
一、说明 时间复杂度和空间复杂度是用来评价算法效率高低的2个标准,身为开发者肯定会经常会听到这2个概念,但它们分别是什么意思呢? 其实这两个概念从字面意思上也能看出一二: 时间复杂度:就是说执行算法需
Umbrella1024
2021/02/28
1.6K0
二叉树前中后遍历
#include #include typedef char ElemType;//二叉树数组类型为字符 //二叉树定义 typedef struct node { ElemType data;//节点信息 struct node* lchild, * rchild;//左右儿子,增加,*parent双亲指针就是三叉链 }Bnode,*BTree; //初始化二叉链 void InitBTree(BTree& BT) { BT = NULL; } //创建二叉链 void CreateBTree
川川菜鸟
2021/10/18
2200
漫谈时间复杂度/空间复杂度
碰到一个问题,总是心心念,因为我不信一个问题没有解决之道。。。只是时间,地点,人物不合适,所以导致无法解决。。。接口总比方法多。
SRE运维实践
2019/07/08
7460
时间复杂度与空间复杂度
算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。对于同一个问题,使用不同的算法,也许最终得到的结果是一样的,但在过程中消耗的资源和时间却会有很大的区别。那么我们应该如何去衡量不同算法之间的优劣呢?
LittlePanger
2020/04/14
9050
算法的时间复杂度与空间复杂度
算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏,一般是从时间和空间两个维度来衡量的,即时间复杂度和空间复杂度。 例如之前的斐波那契数:
有礼貌的灰绅士
2023/03/28
1.1K0
算法的时间复杂度与空间复杂度
时间复杂度与空间复杂度
在计算机程序编写前,依据统计方法对算法进行估算,经过总结,我们发现一个高级语言编写的程序程序在计算机上运行所消耗的时间取决于下列因素:
Rochester
2020/09/01
6220
时间复杂度与空间复杂度
可以看出当N为3时 ,一共递归了3次,每次递归函数调用一次 即时间复杂度为O(N)
lovevivi
2022/11/10
3370
时间复杂度与空间复杂度
二叉树的前中后序遍历
前序遍历主要思想是什么呢?从根节点开始,前序遍历访问左子树,遇到空节点则返回,然后再前序遍历访问右子树,遇到空节点则返回。
看、未来
2020/08/26
4810
二叉树的前中后序遍历

相似问题

空间复杂度是多少?

20

二叉树递归级序遍历的时间复杂度是多少?

26

对于二叉树的广度优先搜索,空间复杂度是多少?

13

这种二叉树字形级遍历算法的时间复杂度是多少?

10

BST的空间复杂度是多少?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文