首先,这个问题不是这个问题的重复,而是在此基础上建立的。
以该问题中的树为例,
1
/ \
2 3
/ / \
4 5 6
您将如何修改程序以进行打印,
1
2 3
4 5 6
而不是一般
1
2
3
4
5
6
我基本上是在寻找最有效的方法的直觉-
我有一种方法,涉及将结果附加到列表中,然后遍历它。一种更有效的方法可能是在弹出每个级别时存储最后一个元素,然后再打印出新行。
有想法吗?
一次只建立一个级别,例如:
class Node(object):
def __init__(self, value, left=None, right=None):
self.value = value
self.left = left
self.right = right
def traverse(rootnode):
thislevel = [rootnode]
while thislevel:
nextlevel = list()
for n in thislevel:
print n.value,
if n.left: nextlevel.append(n.left)
if n.right: nextlevel.append(n.right)
print
thislevel = nextlevel
t = Node(1, Node(2, Node(4, Node(7))), Node(3, Node(5), Node(6)))
traverse(t)
编辑
:如果您希望在最大消耗的“辅助”内存中节省少量费用(永远不要在该“辅助”内存中同时拥有所有此级别和下一个级别),那么您当然可以使用collection.deque
代替list
,并消耗当前(通过popleft
)进行平移,而不是简单地循环。一次创建一个级别的想法(随着您消耗或迭代前一个级别)保持不变-
当您确实需要区分级别时,它比使用单个大双端队列和辅助信息更直接(例如深度或给定级别中剩余的节点数)。
但是,仅附加到列表(并在其上循环而不是“消耗”)的列表比双端队列的效率要高得多(并且如果您使用的是C ++解决方案,则类似地,std ::
vector仅push_back
用于构建它,然后使用它的循环比std :: deque效率更高。由于所有产生都首先发生,然后是所有迭代(或消耗),因此,
如果 内存受到严格限制,一个有趣的替代方法可能是使用列表来表示每个级别,然后.reverse
在开始使用它(通过.pop
调用)之前使用它-
我没有周围的大树可以通过测量进行检查,但是我怀疑这种方法仍会比实际上更快(并且实际上消耗更少的内存)deque
(假设列表[[或std ::
vector]]的基础实现实际上在对pop
[[或pop_back
]]的几次调用之后确实回收了内存-当然,对于双端队列也有相同的假设;-)。
NowCoder 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。 解题思路 // java public ArrayList<arraylist> Print(TreeNode pRoot) { ArrayList<arraylist> ret = new ArrayList<>()
一、题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。 二、解题思路 按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前
我正在研究一个小算法,它可以按照级别顺序构建二叉树。我得到了一个数组,我必须使用其中的值按级别顺序构建二叉树。示例:arr inarr[5]={1,2,3,4,5}; 给定这样的数组,我需要填写一个二叉树,看起来像这样: (*为NULL)节点是基本的二进制节点,具有左指针和右指针以及用于保存数组中值的int的空格。 我理解根据树的高度遍历树的概念,一次遍历一个层次,但我不确定以这种方式构建树的正确
我必须使用层次顺序遍历打印二叉树的节点,但以螺旋形式,即不同层次的节点应该以螺旋形式打印。 例如:如果树看起来像: 输出应为 10 5 20 25 15 6 4。 我使用的算法很简单,只是级别顺序遍历的一个小变化。我只是取了一个变量p.if变量等于1,而不是从左到右打印给定级别的顺序,如果是-1,则从右到左打印。 我得到了答案,但在歪斜树的情况下,最坏的情况复杂度可能是O(n^2)。 这个任务能有
//执行顺序遍历的递归方法
问题内容: ls命令以以下格式打印时间: 我如何转换,从接收到的时间的这个格式的本地时间? 问题答案: 使用strftime(您需要先转换为): 格式: 这是完整的代码: