LeetCode 144. 二叉樹的前序遍歷 (C++)
阿新 • • 發佈:2019-02-20
題目:
給定一個二叉樹,返回它的 前序 遍歷。
示例:
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [1,2,3]
進階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
思路:
二叉樹的前序遍歷規則
1. 訪問根結點;
2. 遍歷左子樹;
3. 遍歷右子樹
遞迴實現方式:
/**
* 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 {
private:
void rec(TreeNode* root,vector<int> &ret){
if(root != NULL){
rec(root->right,ret);
rec(root->left,ret);
ret.push_back(root->val);
}
}
public:
vector<int> postorderTraversal(TreeNode* root) {
vector <int> ret;
rec(root,ret);
return ret;
}
};
非遞迴實現方式:(程式碼中有詳細註釋,就不解釋了)
/**
* 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 :
/*//遞迴實現
void rec(TreeNode* root,vector<int> &ret){
if(root != NULL){
ret.push_back(root->val);
rec(root->left,ret);
rec(root->right,ret);
}
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ret;
rec(root,ret);
return ret;
}
*/
vector<int> preorderTraversal(TreeNode* root) {
//非遞迴實現
vector<int> ret;
//未遍歷到的節點
stack<TreeNode*> toTraversal;
while(root!=NULL){
ret.push_back(root->val);
//存在左子樹
if(root->left != NULL){
//存在右子樹,將右子樹壓入棧中
if(root->right != NULL)
toTraversal.push(root->right);
//由於存在左子樹,不論是否存在右子樹,都繼續遍歷左子樹
root = root->left;
continue;
}
//不存在左子樹,但存在右子樹,直接遍歷右子樹
if(root->right != NULL){
root = root->right;
continue;
}
//不存在左子樹,且不存在右子樹,但棧不為空
if(!toTraversal.empty()){
//彈出棧頂元素,繼續遍歷
root = toTraversal.top();
toTraversal.pop();
continue;
}
break;
}
return ret;
}
};