剑指Offer-22.从上往下打印二叉树(C++/Java)
题目:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。
分析:
按层次打印二叉树的节点,重点就是我们在打印一层节点的时候,同时按顺序保存好当前节点的下一层节点,也就是左节点和右节点,当此层节点打印完毕后,再打印刚才保存好的节点序列,也就是广度优先遍历。我们可以使用两个数组分别用来保存打印层节点,和下一层节点,在当前层结束后,将下层数组赋给打印数组,循环执行,知道打印数组为空,也就打印完毕了。
也可以使用队列来打印二叉树,每打印一个节点,就将这个节点的左右节点添加进队列中,直到队列为空。
程序:
C++
class Solution { public: vector<int> PrintFromTopToBottom(TreeNode* root) { if(root == nullptr) return res; vector<TreeNode*> TNode; vector<TreeNode*> temp; TNode.push_back(root); while(!TNode.empty()){ for(int i = 0; i < TNode.size(); ++i){ res.push_back(TNode[i]->val); if(TNode[i]->left) temp.push_back(TNode[i]->left); if(TNode[i]->right) temp.push_back(TNode[i]->right); } TNode.swap(temp); temp.clear(); } return res; } private: vector<int> res; };
Java
import java.util.ArrayList; import java.util.Queue; import java.util.LinkedList; /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root == null) return res; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.offer(root); while(!queue.isEmpty()){ TreeNode n = queue.poll(); res.add(n.val); if(n.left != null) queue.offer(n.left); if(n.right != null) queue.offer(n.right); } return res; } private ArrayList<Integer> res = new ArrayList<>(); }