这个概念是,每个节点都会知道它的子树大小,首先知道它的所有子节点的子树大小,在这里是最大的两个子节点,因为它是一个二叉树,所以,一旦它知道所有子节点的子树大小,它就可以将所有子节点相加,最后在结果中加1,然后它的父节点也会做同样的事情,依此类推到根节点。若我们考虑叶节点,它并没有子节点,所以结果子树的大小只有1,其中包含它自己。
这个想法很清楚,编写代码很容易,在遍历时,我们将首先知道当前节点的子节点的子树大小,然后在其中添加1,如果是叶节点,则子树大小仅为1,下面是traverse Function的伪代码,它查找每个节点的子树大小并将它们存储在dictionary sizeDictionary中,并使用范围更大的访问字典/数组跟踪访问的节点。
traverse(Tree curNode, dictionary subTreeSizeDictionary)
visited[curNode] = true
subtreeSizeDictionary[curNode] = 0
for child of curNode
if(notVisited[child])
traverse(child , sizeDictionary)
subtreeSizeDictionary[curNode] += subtreeSizeDictionary[child]
subtreeSizeDictionary[curNode] += 1;
这里是二叉树,但是从伪代码中可以看出,这个概念可以用于任何有效的树,时间复杂度为O(n),因为我们只访问了每个节点一次。
您可以进行后序遍历来查找每个节点的大小。
这个想法是首先处理左树和右树。然后,在处理它们之后,您可以使用这些数据来处理当前节点。
这应该类似于:
count = 0
if (node.left != none)
count += visit(node.left)
if (node.right != none)
count += visit(node.right)
// self is included.
count += 1
// update the node
node.size = count
return count
不需要访问节点的字典,因为这是一棵树,它保证结束。
作为旁注,每个节点的size
属性是一个重要的属性。它基本上将您的树升级为订单统计树
我需要编写伪代码来检查有效的二叉树是否是搜索二叉树。 我创建了一个数组来保存树的顺序值。如果顺序值是降序的,这意味着它确实是BST。然而,我对INOVERAR方法中的递归有一些问题。 我需要更新数组的索引,以便按照值在树上的顺序将其提交给数组。 我不确定在递归过程中索引是否真的得到了正确更新。。到底是不是?如果你发现问题,能帮我解决吗?谢谢 伪代码 第一功能 IsBST(节点) 大小← 树化(节点
主要内容:二叉树的性质,满二叉树,完全二叉树,总结通过《 树的存储结构》一节的学习,我们了解了一些树存储结构的基本知识。本节将给大家介绍一类具体的树结构—— 二叉树。 简单地理解,满足以下两个条件的树就是二叉树: 本身是有序树; 树中包含的各个节点的度不能超过 2,即只能是 0、1 或者 2; 例如,图 1a) 就是一棵二叉树,而图 1b) 则不是。 图 1 二叉树示意图 二叉树的性质 经过前人的总结,二叉树具有以下几个性质: 二叉树中,第 i
本文向大家介绍手写代码:给一个二叉树,怎么得到这棵树的镜像相关面试题,主要包含被问及手写代码:给一个二叉树,怎么得到这棵树的镜像时的应答技巧和注意事项,需要的朋友参考一下 参考回答:
本文向大家介绍javascript实现二叉树的代码,包括了javascript实现二叉树的代码的使用技巧和注意事项,需要的朋友参考一下 前言: 二叉树的特点(例图只是二叉树的一种情况,不要尝试用例图推理以下结论) 除了最下面一层,每个节点都是父节点,每个节点都有且最多有两个子节点; 除了嘴上面一层,每个节点是子节点,每个节点都会有一个父节点; 最上面一层的节点(即例图中的节点50)为根节点; 最下
平衡二叉树被定义为任何节点的两个子树的高度相差不超过一的树。 我的问题是,如果其中一个子树不存在或基本上子树为空怎么办
我曾试图实现代码来实现平衡二叉搜索树的方式(蛮力),我发现有一个案例(树),似乎无法平衡。这棵树是 你可以明显地发现,这棵树的右边高度比它的左边高度大得多,所以我绕着'6'向左旋转,那么新树就会 然后,左边的高度比右边的高度大得多,所以在下一步中,我必须围绕节点“10”向右(返回)旋转树。 似乎必须有一个无限循环来旋转这棵树围绕它的根节点(旋转左、右、左、右……以此类推),同时平衡这棵树。平衡这棵