剑指offer 面试32题
面试32题:
题目:从上到下打印二叉树
题:不分行从上到下打印二叉树
解题代码:
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回从上到下每个节点值列表,例:[1,2,3] def PrintFromTopToBottom(self, root): # write code here if not root: return [] res=[] res_val=[] res.append(root) while len(res)>0: node=res.pop(0) res_val.append(node.val) if node.left: res.append(node.left) if node.right: res.append(node.right) return res_val
题目拓展一:分行从上到下打印二叉树。
题:从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
解题代码一:同剑指offer
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回二维列表[[1,2],[4,5]] def Print(self, pRoot): # write code here if not pRoot: return [] res=[] res_val=[] res.append(pRoot) nextLevel=0 #表示下一层节点的数目 toBePrinted=1 #表示当前层还没有打印的节点数 temp=[] while len(res)>0: node=res[0] temp.append(node.val) if node.left: res.append(node.left) nextLevel+=1 if node.right: res.append(node.right) nextLevel+=1 del res[0] toBePrinted-=1 if toBePrinted==0: res_val.append(temp) toBePrinted=nextLevel nextLevel=0 temp=[] return res_val
解题代码二:代码更简洁。
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回二维列表[[1,2],[4,5]] def Print(self, pRoot): # write code here if not pRoot: return [] res,nodes=[],[pRoot] while nodes: curStack,nextStack=[],[] for node in nodes: curStack.append(node.val) if node.left: nextStack.append(node.left) if node.right: nextStack.append(node.right) res.append(curStack) nodes=nextStack return res
解题代码三:cur、last记录,思路同二
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # 返回二维列表[[1,2],[4,5]] def Print(self, pRoot): # write code here if not pRoot: return [] res=[] arr=[] arr.append(pRoot) cur=0 #last=1 while cur<len(arr): last=len(arr) temp=[] while (cur<last): temp.append(arr[cur].val) if arr[cur].left: arr.append(arr[cur].left) if arr[cur].right: arr.append(arr[cur].right) cur+=1 res.append(temp) return res
题目拓展二:之字形打印二叉树
题:请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
解题代码一:简洁。
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def Print(self, pRoot): # write code here if not pRoot: return [] res=[] nodes=[pRoot] leftToRight=True while nodes: curStack,nextStack=[],[] for node in nodes: curStack.append(node.val) if node.left: nextStack.append(node.left) if node.right: nextStack.append(node.right) if not leftToRight: curStack.reverse() res.append(curStack) leftToRight = not leftToRight nodes=nextStack
解题代码二:同剑指offer。
# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def Print(self, pRoot): # write code here if not pRoot: return [] res=[] nodes=[pRoot] right=True while nodes: curStack,nextStack=[],[] if right: for node in nodes: curStack.append(node.val) if node.left: nextStack.append(node.left) if node.right: nextStack.append(node.right) else: for node in nodes: curStack.append(node.val) if node.right: nextStack.append(node.right) if node.left: nextStack.append(node.left) res.append(curStack) nextStack.reverse() right=not right nodes=nextStack return res