二叉樹的層次遍歷 佇列的應用

2021-09-27 00:14:15 字數 2126 閱讀 1146

給定乙個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。

例如:給定二叉樹: [3,9,20,null,null,15,7],

3
/

9 20

/ 15 7

返回其層次遍歷結果:

[[3],

[9,20],

[15,7]

]二叉樹層次遍歷的題目,第一想到的就是官渡優先搜尋。

下面做乙個總結:

樹的遍歷方法一般分為兩種:一種是廣度優先遍歷(bfs),一種是深度優先遍歷(dfs),

bfs:對應的就是二叉樹的層次遍歷;

dfs:可以分為二叉樹的前序遍歷,中序遍歷,後序遍歷這三種遍歷方法;

解決這些遍歷的方法有三種:

1、遞迴(最直接想到的方法)

2、迭代法,使用資料結構(bfs用到佇列,dfs用到棧)

下面使用遞迴的方法

思路:最簡單的解法就是遞迴,首先確認樹非空,然後呼叫遞迴函式 helper(node, level),引數是當前節點和節點的層次。程式過程如下:

輸出列表稱為 levels,當前最高層數就是列表的長度 len(levels)。比較訪問節點所在的層次 level 和當前最高層次 len(levels) 的大小,如果前者更大就向 levels 新增乙個空列表。

將當前節點插入到對應層的列表 levels[level] 中。

遞迴非空的孩子節點:helper(node.left / node.right, level + 1)。

c++

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

if(node->right)

return res;

}vector> levelorder(treenode* root) ;

if(!root);

}return helper(root,0,res);

}};

python3

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class solution:

def levelorder(self, root: treenode) -> list[list[int]]:

res=

if not root:

return res

return self.helper(root, 0, res)

def helper(self,node: treenode, level,res) -> list[list[int]]:

if len(res)==level:

if node.left:

res = self.helper(node.left, level+1, res)

if node.right:

res = self.helper(node.right, level+1,res)

return res

複雜度分析

時間複雜度:o(n)o(n),因為每個節點恰好會被運算一次。

空間複雜度:o(n)o(n),儲存輸出結果的陣列包含 n 個節點的值。

c++

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

queueq;

q.push(root);

treenode* p;

while(!q.empty())

if(p->right)

}res.push_back(temp);

}return res;

}};

二叉樹的層次遍歷

前幾天,宿舍乙個mm問我,二叉樹的層次遍歷演算法是如何實現的。於是,正在洗腳的我開動疲勞了一整天的腦筋,開始思考這個問題。因為之前看演算法的時候,樹就看的不多,而且即使是關於二叉樹的,主要也都是因為遞迴的原因,主要思考的是前序 中序和後序遍歷。甚至於,在前面的文章中,也 了 已知前序遍歷和中序遍歷,...

二叉樹的層次遍歷

二叉樹的層次遍歷是佇列queue這個資料結構的乙個經典應用場景之一,注意佇列裡的元素型別是節點指標 不知道並且有興趣的可以想想為什麼 struct treenode class solution return v 上面那個 queue裡的元素為何指標比較好 的問題的乙個可能的回答 不一定對,僅個人理...

二叉樹的層次遍歷

終於自己能夠寫出二叉樹的前序,中序,後序和層次遍歷了,還是有點開心的。才發現原來建樹是那麼簡單,只要理解好遞迴就差不多了。之前轉過前中後序的遍歷,現在就記下層次遍歷吧。用pat上的題當例子吧。時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作...