1. 二叉樹的前序遍歷
- 根 左 右
- 因爲先訪問根節點,所以直接將
root
的val
放入答案(ans)容器內。 - 然後遍歷左子樹,現在以
root
的左子樹爲root
進入遞歸。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> ans;
vector<int> preorderTraversal(TreeNode* root) {
if(root != NULL){
ans.push_back(root -> val);
preorderTraversal(root -> left);
preorderTraversal(root -> right);
}
return ans;
}
};
2. 二叉樹的中序遍歷
- 左 根 右
- 與前序遍歷相似,只需要調換順序。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> ans;
vector<int> inorderTraversal(TreeNode* root) {
if(root!=NULL){
inorderTraversal(root->left);
ans.push_back(root->val);
inorderTraversal(root->right);
}
return ans;
}
};
3. 二叉樹的後序遍歷
- 左 右 根
class Solution {
public:
vector<int> ans;
vector<int> postorderTraversal(TreeNode* root) {
if(root!=NULL){
postorderTraversal(root->left);
postorderTraversal(root->right);
ans.push_back(root->val);
}
return ans;
}
};
4. 二叉樹的層序遍歷 - 廣度優先搜索(BFS 隊列)
給定一個二叉樹,返回其按層序遍歷得到的節點值。 層序遍歷即逐層地、從左到右訪問所有結點。
示例:
二叉樹:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其層次遍歷結果:
[
[3],
[9,20],
[15,7]
]
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector <vector <int>> ret; //定義輸出的二維數組
if (!root) return ret; //如果沒有節點,輸出空的二維數組
queue <TreeNode*> q; //定義結構體隊列q
q.push(root); //將根節點加入進去
while (!q.empty()) { //當隊列不爲空時,即表示二叉樹還存在左右子樹
int currentLevelSize = q.size(); //當前隊列q內的元素個數
ret.push_back(vector <int> ()); //輸出ret加入一個新的空vector
for (int i = 1; i <= currentLevelSize; i++) {
auto node = q.front(); q.pop(); //node取爲q的第一個元素,再去掉這個元素
ret.back().push_back(node->val); //給ret的最後一個元素即空vector加入q的第一個元素
if (node->left) q.push(node->left); //如果存在左節點,給隊列q加入該節點
if (node->right) q.push(node->right);
}
}
return ret;
}
};
/*返回其自底向上的層次遍歷爲:
[
[15,7],
[9,20],
[3]
]
*/
//只需要反序輸出二維數組即可(有以下兩種方法)
reverse(ret.begin(),ret.end());
return vector <vector <int>>(ret.rbegin(),ret.rend());
複雜度分析
記樹上所有節點的個數爲 n。
時間複雜度:每個點進隊出隊各一次,故漸進時間複雜度爲 O(n)。
空間複雜度:隊列中元素的個數不超過 n 個,故漸進空間複雜度爲 O(n)。
鏈接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/