剑指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<>();
}

 

posted @ 2019-11-24 00:06  silentteller  阅读(246)  评论(0编辑  收藏  举报