数据结构有哪些类型和特点?
- 内容介绍
- 相关推荐
本文共计1474个文字,预计阅读时间需要6分钟。
今天,接续上一期的文章,继续推进!🚀
求一棵树的高度,为何需要存储起来呢?
解答这个问题之前,需要稍微调整一下上述代码:
python假设这是计算树高度的函数def calculate_tree_height(node): if node is None: return 0 return 1 + max(calculate_tree_height(child) for child in node.children)
假设这是树的节点类class TreeNode: def __init__(self, value): self.value=value self.children=[]
示例树的构建root=TreeNode('root')child1=TreeNode('child1')child2=TreeNode('child2')root.children.append(child1)root.children.append(child2)child1.children.append(TreeNode('grandchild1'))child2.children.append(TreeNode('grandchild2'))
计算树的高度height=calculate_tree_height(root)print(height)
上述代码中,`calculate_tree_height` 函数通过递归计算树的高度。每次递归调用都会计算子节点的高度,并返回最大值加一。这个过程对于每个节点都会重复进行,导致计算效率较低。
那么,为什么需要存储树的高度呢?
1. 避免重复计算:如果需要多次获取树的高度,每次都重新计算会非常耗时。存储树的高度可以避免重复计算,提高效率。
2. 提高性能:在某些情况下,树的高度可能会被频繁查询。存储高度可以减少计算时间,提高程序性能。
3. 减少内存占用:对于大型树,计算高度可能需要大量内存。存储高度可以减少内存占用,避免内存溢出。
总之,存储树的高度可以带来诸多好处,特别是在需要频繁查询树高度的场景下。
今天,接着上一期的博文,继续推进!!
请看下面的的代码 :>
求一棵树的高度,为何需要存储起来呢?
解答这个问题之前,需要稍微改动一下,上述的代码!会发现上述代码有很大的好处!
//二叉树的高度
int TreeHight(BTNode* root)
{
if(root == NULL)
{
return 0;
}
return TreeHight(root ->leftChild) > TreeHight(root ->rightBrother)
? TreeHight(root ->leftChild) + 1
: TreeHight(root ->rihgtBrother) + 1;
}
好了,各位好友!!再一次手搓了一遍求树的高度的代码!!
我们发现上述的改动很明显!!那就是我们删掉了保存值!!
那么这样会引发什么问题呢?
其实,还是直接先说答案好了。没有保存值的情况下,会造成递归遍历的次数成指数增长!!
举一个例子,请看下图 :>
如果没有保存值的情况下,对于最底层的数字,被访问次数会大到超乎想象!!
假如,访问的是层级为10的话,那么它的次数是1024次
而当层级是20的时候,它的次数是100万!
而当层级为30的时候,被访问的次数将会达到10亿!!
是不是看着这些数字,特别敏感,其实这是一个等比数列 :> 2^n
上述的次数,是由递归展开图,总结出来的!!
显然,这样子,此种很挫的写法。时间复杂度就是 O(n^2)
其实,求 树的最大高度,对于底层的访问仅仅一次就可以了!此时,时间复杂度是O(n)
希望老友们,可以好好体会!!在这里,对递归的要求是蛮高的!!
另外,还要说明一下, 代码中 有一个 “+ 1”是怎么回事!!
-----> 当递归完成左子树或者右子树的时候,此时的高度是 从子树到叶子结点的距离,而一开始的子树到根的距离还有一个单位的长度!!
下面,开始另一段代码 :>
另外,还遗漏了一个小细节,这里的 K 的取值范围,是需要断言一下的!
------> 断言 K 的范围 “assert(K > 0);”
其实这段代码,比刚才的求树的高度难度有所提升,理解上更进了一步!!
那么,该如何解读才可以呢!在这里,涉及到相对距离,什么意思呢?
请看下列图示 :>
上述二叉树层为四层数,而现在求的是第三层的结点个数!相对位置怎么样呢?--->K == 3
那么从根结点开始相对于第三层就是距离3个单位
对于第二层而言,便是距离为2个单位
则第三层,距离就是1个单位了
为了方便理解,递归过程的展开图是要画出来的!请看下面图示 :>
在这里并没有什么所谓 0层!0层没有任何意义!!
这个时候再看一下代码,是不是理解就容易多了!!其实核心思想:相对位置的理解
注意,空子树的时候就返回 0 就可以了;那么 K == 4 层级的时候,显然是返回 1 个结点,毕竟 结点 5 的右子树是空树嘛!
至此,上一期学到的内容,重要的难点和一些细节,就已经讲解完成了!!各位老友,有没有真正 Get 到
本文共计1474个文字,预计阅读时间需要6分钟。
今天,接续上一期的文章,继续推进!🚀
求一棵树的高度,为何需要存储起来呢?
解答这个问题之前,需要稍微调整一下上述代码:
python假设这是计算树高度的函数def calculate_tree_height(node): if node is None: return 0 return 1 + max(calculate_tree_height(child) for child in node.children)
假设这是树的节点类class TreeNode: def __init__(self, value): self.value=value self.children=[]
示例树的构建root=TreeNode('root')child1=TreeNode('child1')child2=TreeNode('child2')root.children.append(child1)root.children.append(child2)child1.children.append(TreeNode('grandchild1'))child2.children.append(TreeNode('grandchild2'))
计算树的高度height=calculate_tree_height(root)print(height)
上述代码中,`calculate_tree_height` 函数通过递归计算树的高度。每次递归调用都会计算子节点的高度,并返回最大值加一。这个过程对于每个节点都会重复进行,导致计算效率较低。
那么,为什么需要存储树的高度呢?
1. 避免重复计算:如果需要多次获取树的高度,每次都重新计算会非常耗时。存储树的高度可以避免重复计算,提高效率。
2. 提高性能:在某些情况下,树的高度可能会被频繁查询。存储高度可以减少计算时间,提高程序性能。
3. 减少内存占用:对于大型树,计算高度可能需要大量内存。存储高度可以减少内存占用,避免内存溢出。
总之,存储树的高度可以带来诸多好处,特别是在需要频繁查询树高度的场景下。
今天,接着上一期的博文,继续推进!!
请看下面的的代码 :>
求一棵树的高度,为何需要存储起来呢?
解答这个问题之前,需要稍微改动一下,上述的代码!会发现上述代码有很大的好处!
//二叉树的高度
int TreeHight(BTNode* root)
{
if(root == NULL)
{
return 0;
}
return TreeHight(root ->leftChild) > TreeHight(root ->rightBrother)
? TreeHight(root ->leftChild) + 1
: TreeHight(root ->rihgtBrother) + 1;
}
好了,各位好友!!再一次手搓了一遍求树的高度的代码!!
我们发现上述的改动很明显!!那就是我们删掉了保存值!!
那么这样会引发什么问题呢?
其实,还是直接先说答案好了。没有保存值的情况下,会造成递归遍历的次数成指数增长!!
举一个例子,请看下图 :>
如果没有保存值的情况下,对于最底层的数字,被访问次数会大到超乎想象!!
假如,访问的是层级为10的话,那么它的次数是1024次
而当层级是20的时候,它的次数是100万!
而当层级为30的时候,被访问的次数将会达到10亿!!
是不是看着这些数字,特别敏感,其实这是一个等比数列 :> 2^n
上述的次数,是由递归展开图,总结出来的!!
显然,这样子,此种很挫的写法。时间复杂度就是 O(n^2)
其实,求 树的最大高度,对于底层的访问仅仅一次就可以了!此时,时间复杂度是O(n)
希望老友们,可以好好体会!!在这里,对递归的要求是蛮高的!!
另外,还要说明一下, 代码中 有一个 “+ 1”是怎么回事!!
-----> 当递归完成左子树或者右子树的时候,此时的高度是 从子树到叶子结点的距离,而一开始的子树到根的距离还有一个单位的长度!!
下面,开始另一段代码 :>
另外,还遗漏了一个小细节,这里的 K 的取值范围,是需要断言一下的!
------> 断言 K 的范围 “assert(K > 0);”
其实这段代码,比刚才的求树的高度难度有所提升,理解上更进了一步!!
那么,该如何解读才可以呢!在这里,涉及到相对距离,什么意思呢?
请看下列图示 :>
上述二叉树层为四层数,而现在求的是第三层的结点个数!相对位置怎么样呢?--->K == 3
那么从根结点开始相对于第三层就是距离3个单位
对于第二层而言,便是距离为2个单位
则第三层,距离就是1个单位了
为了方便理解,递归过程的展开图是要画出来的!请看下面图示 :>
在这里并没有什么所谓 0层!0层没有任何意义!!
这个时候再看一下代码,是不是理解就容易多了!!其实核心思想:相对位置的理解
注意,空子树的时候就返回 0 就可以了;那么 K == 4 层级的时候,显然是返回 1 个结点,毕竟 结点 5 的右子树是空树嘛!
至此,上一期学到的内容,重要的难点和一些细节,就已经讲解完成了!!各位老友,有没有真正 Get 到

