diff --git a/notes/面试总结.md b/notes/面试总结.md index 6e4dfb66..1ca3aeb7 100644 --- a/notes/面试总结.md +++ b/notes/面试总结.md @@ -34,6 +34,8 @@ * [29. 顺时针打印矩阵](#29-顺时针打印矩阵) * [30. 包含 min 函数的栈](#30-包含-min-函数的栈) * [31. 栈的压入、弹出序列](#31-栈的压入弹出序列) +* [32.1 从上往下打印二叉树](#321-从上往下打印二叉树) +* [32.2 把二叉树打印成多行](#322-把二叉树打印成多行) * [参考文献](#参考文献) @@ -2291,6 +2293,159 @@ class Solution: return False return True ``` +# 32.1 从上往下打印二叉树 + +[NowCoder](https://www.nowcoder.com/practice/7fe2212963db4790b57431d9ed259701?tpId=13&tqId=11175&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) + +## 题目描述 + +从上往下打印出二叉树的每个节点,同层节点从左至右打印。 + +例如,以下二叉树层次遍历的结果为:1,2,3,4,5,6,7 + +

+ +## 解题思路 + +使用队列来进行层次遍历。 + +不需要使用两个队列分别存储当前层的节点和下一层的节点,因为在开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数,只要控制遍历这么多节点数,就能保证这次遍历的都是当前层的节点。 + +```java +public ArrayList PrintFromTopToBottom(TreeNode root) { + Queue queue = new LinkedList<>(); + ArrayList ret = new ArrayList<>(); + queue.add(root); + while (!queue.isEmpty()) { + int cnt = queue.size(); + while (cnt-- > 0) { + TreeNode t = queue.poll(); + if (t == null) + continue; + ret.add(t.val); + queue.add(t.left); + queue.add(t.right); + } + } + return ret; +} +``` + +```python +# -*- 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 + queue = [] + ret = [] + queue.append(root) + while queue: + cnt = len(queue) + while cnt > 0: + cnt -= 1 + t = queue.pop(0) + if t == None: + continue + ret.append(t.val) + queue.append(t.left) + queue.append(t.right) + return ret +``` + +```python +# -*- 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 + l=[] + if not root: + return [] + q=[root] + while len(q): + t=q.pop(0) + l.append(t.val) + if t.left: + q.append(t.left) + if t.right: + q.append(t.right) + return l +``` + +# 32.2 把二叉树打印成多行 + +[NowCoder](https://www.nowcoder.com/practice/445c44d982d04483b04a54f298796288?tpId=13&tqId=11213&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking) + +## 题目描述 + +和上题几乎一样。 + +## 解题思路 + +```java +ArrayList> Print(TreeNode pRoot) { + ArrayList> ret = new ArrayList<>(); + Queue queue = new LinkedList<>(); + queue.add(pRoot); + while (!queue.isEmpty()) { + ArrayList list = new ArrayList<>(); + int cnt = queue.size(); + while (cnt-- > 0) { + TreeNode node = queue.poll(); + if (node == null) + continue; + list.add(node.val); + queue.add(node.left); + queue.add(node.right); + } + if (list.size() != 0) + ret.add(list); + } + return ret; +} +``` + +```python +# -*- 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 + ret = [] + # queue = [] + # queue.append(pRoot) + queue = [pRoot] + while queue: + list = [] + cnt = len(queue) + while cnt > 0: + cnt -= 1 + node = queue.pop(0) + if node == None: + continue + list.append(node.val) + queue.append(node.left) + queue.append(node.right) + if len(list): + ret.append(list) + return ret +``` # 参考文献