BFSの紹介
バイナリツリー階層トラバーサルと同様に、最初に同じ深さのノードをトラバースし、トラバーサル後に異なる深さまでトラバースします。
PS :(ビデオを1000回見た後、ビデオを理解できません。アルゴリズムを学ぶ最も速い方法は、質問をブラッシングすることです...)
LeetCodeインタビューの質問04.03。特定の深度ノードのリンクリスト
バイナリツリーが与えられた場合、特定の深さのすべてのノードを含むリンクリストを作成するアルゴリズムを設計します(たとえば、ツリーの深さがDの場合、Dのリンクリストが作成されます)。すべての深さのリンクされたリストの配列を返します。
例:
入力:[1,2,3,4,5、null、7,8]
1 / \ 2 3 / \ \ 4 5 7 / 8
出力:[[1]、[2,3]、[4,5,7]、[8]]
アイデア:
再帰+キューを使用して単純なBFSを実装する
コード:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<ListNode*> listOfDepth(TreeNode* tree) {
vector<ListNode*> ans;
queue<TreeNode*> q;
q.push(tree);
while(!q.empty()){
int size=q.size();
TreeNode *node;
ListNode *head,*prev,*curr;
for(int i=0;i<size;++i){
node=q.front();
q.pop();
if(i==0){
head=new ListNode(node->val);
prev=head;
}
else{
curr=new ListNode(node->val);
prev->next=curr;
prev=prev->next;
}
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
}
ans.push_back(head);
}
return ans;
}
};