【LeetCode】Binary Tree Postorder Traversal

  使用迭代的版本:node

#include <vector>

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
 
class Solution {
public:
    std::vector<int> postorderTraversal(TreeNode *root) {
        vector<int> result;
        
        traversal(result, root);
        
        return result;
    }
    
    void traversal(std::vector<int>& result, TreeNode *node)
    {
        if (node == NULL) return;
        
        traversal(result, node->left);
        traversal(result, node->right);
        result.push_back(node->val);   
    }
};

  不使用迭代的版本(使用棧):post

#include <stack>
#include <vector>
#include <algorithm>

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:

	// 至關於倒着遍歷一遍節點,postorder的輸出順序應該是 (left -> right -> node)
	// 那咱們如今就按照倒敘遍歷這顆樹並利用棧的性質進行輸出 (node -> right -> left)
	// 每次在遍歷的時候都把棧頂元素出棧,至關於獲得當前未遍歷節點集合的最後一個節點
	std::vector<int> postorderTraversal(TreeNode *root) { 
		std::vector<int>		    result;
		std::stack<TreeNode *>		_stack;

        if (root == NULL) return result;
        
		_stack.push(root);

		while (!_stack.empty())
		{
			// 出棧當前節點值
			TreeNode *cur = _stack.top(); _stack.pop();
			result.push_back(cur->val);
			
			// 入棧左子節點
			TreeNode *left = cur->left;
			if (left) _stack.push(left);
			
			// 入棧右子節點
			TreeNode *right = cur->right;
			if (right) _stack.push(right);
		}

		std::reverse(result.begin(), result.end());
		return result;
	}
};

#endif // BINARY_TREE_POSTORDER_TRAVERSAL_H
相關文章
相關標籤/搜索