剑指offer:按之字形顺序打印二叉树
2019-05-22 23:38
1441 查看
题目描述
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: """ 由于需要打印Z字型,那么我们在遍历整棵树的时候就需要维护一个栈。 栈中存储的是下一层的节点的逆序,则在访问的时候按照栈的FILO特性就是正确的节点顺序。 具体来说在打印奇数层的节点的时候,将该节点的【左右】子节点按顺序入栈, 在打印偶数层的节点的时候,将该节点的【右左】节点按顺序入栈。 总结:遇到这类问题我们应该先构造一棵二叉树然后按照题目要求模拟一遍,观察出应该使用什么样的数据 结构,然后再进行编程 """ def Print(self, pRoot): def helper(root_stack, ans, turns): # 递归出口即队列为空 if not root_stack: return length = len(root_stack) temp = [] for i in range(length - 1, -1, -1): # 对于某个节点,在打印完它的值之后,将其左右子节点先后入队 temp.append(root_stack[i].val) if root_stack[i].left: root_stack.append(root_stack[i].left) if root_stack[i].right: root_stack.append(root_stack[i].right) # 注意这里我们判断当前层的奇偶性之后再决定是【左右】还是【右左】 # 由于是对root_stack的最后两个元素进行位置交换,需要小心下标越界问题 if turns & 1 != 0 and len(root_stack) > length + 1: root_stack[-1], root_stack[-2] = \ root_stack[-2], root_stack[-1] ans.append(temp) helper(root_stack[length:], ans, turns + 1) res = [] if not pRoot: return res helper([pRoot], res, 0) return res def main(): root = TreeNode(5) root.left = TreeNode(4) root.left.left = TreeNode(3) root.left.left.left = TreeNode(2) solution = Solution() print(solution.Print(root)) if __name__ == '__main__': main()
相关文章推荐
- 剑指offer(59)按之字形顺序打印二叉树
- 剑指offer系列之58:按之字形顺序打印二叉树
- 剑指offer 按之字形顺序打印二叉树
- 剑指offer-按之字形顺序打印二叉树-php
- 剑指offer——面试题61:按之字形顺序打印二叉树
- 《剑指offer》Python语言 面试题61:按之字形顺序打印二叉树
- 剑指offer(按之字形顺序打印二叉树)
- 剑指offer:按之字形顺序打印二叉树
- 剑指offer——按之字形顺序打印二叉树
- 剑指offer:按之字形顺序打印二叉树
- 剑指offer-按之字形顺序打印二叉树
- 剑指offer-面试题61-按之字形顺序打印二叉树
- (剑指Offer)面试题61:按之字形顺序打印二叉树
- 剑指offer-面试题61:按之字形顺序打印二叉树
- 《剑指offer》按之字形顺序打印二叉树
- 《剑指offer》——按之字形顺序打印二叉树
- python剑指offer系列按之字形顺序打印二叉树
- 剑指offer系列之五十四:按之字形顺序打印二叉树
- 剑指offer(56)-按之字形顺序打印二叉树
- 《剑指offer》:[61]按之字形顺序打印二叉树