劍指offer——從上往下打印出二叉樹

題目:

從上往下打印出二叉樹的每個節點,同層節點從左至右打印。

思路:廣度優先搜索

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    vector<int> PrintFromTopToBottom(TreeNode* root) {
        vector<int> v;
        queue<TreeNode*> q;
        q.push(root);
        if(root==NULL) return {};
        while(!q.empty())
        {
            v.push_back(q.front()->val);
            if(q.front()->left!=NULL)
                q.push(q.front()->left);
            if(q.front()->right!=NULL)
                q.push(q.front()->right);
            q.pop();
        }
        return v;
    }
};

小見:

        對二叉樹相關問題掌握的向來都不太好,看了下評論區的答案提到了廣度優先搜索,查了一下廣度優先搜索和深度優先搜索。

首先,本題中使用的廣度優先搜索思想,是指,藉助隊列按層存儲節點,然後只要按順序打印就好了。

具體過程如下:

1、準備:創建一個節點型(需要搜索的節點的類型)隊列,用來存放每一層的頂點;

                創建一個int型數組,用來記錄被訪問過的頂點(此處存放該頂點的值);

2、從某個節點(根節點)開始訪問,將這個節點的值設爲true,同時入隊;

3、只要隊列不空,重複如下操作:

  (1)隊頭頂點出隊;

  (2)依次檢查該頂點的所有鄰接節點(左右子樹),如果值爲falsh,則訪問、置爲true併入隊,反之不訪問;

備註:在二叉樹中不存在重複訪問的情況,即不存在多對一的情況,所以這一步不需要;而用來記錄訪問節點的數組在本題中可以作爲存放各頂點的值(它的使用順序與節點入隊順序一致);

 

關於廣度優先搜索與深度優先搜索的相關知識整理如下:

https://www.cnblogs.com/skywang12345/p/3711483.html

https://blog.csdn.net/weixin_40953222/article/details/80544928

廣度藉助隊列,深度藉助棧

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章