給定乙個二叉樹,返回其按層次遍歷的節點值。 (即逐層地,從左到右訪問所有節點)。
例如:給定二叉樹: [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 作...