1. 程式人生 > >LeetCode 144. 二叉樹的前序遍歷 (C++)

LeetCode 144. 二叉樹的前序遍歷 (C++)

題目:

給定一個二叉樹,返回它的 前序 遍歷。
示例:

輸入: [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; } };