[leetcode]binary-tree-postorder-traversal

题目描述

Given a binary tree, return the postorder traversal of its nodes’ values.

解法

  • 这道题是二叉树后序遍历的非递归实现
  • 先观察递归实现
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	void helper(TreeNode* root, vector<int>& res) {
		if(!root)
			return;
		helper(root -> left, res);
		helper(root -> right, res);
		res.push_back(root -> val);
	}
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> res;
        if(!root)
            return res;
        
        helper(root, res);
        return res;
    }
};
  • helper()函数中可以看到,先递归访问左右子节点再访问当前节点说到helper()函数,就想到了栈:每次都把当前节点入栈,如果左右子节点存在则把左右子节点入栈,这样左右子节点在栈顶而当前节点在栈底,根据栈后进先出的特性,就能实现后序遍历了
  • 再进一步,对于当前节点root分三种情况处理
  1. root是叶节点,直接输出
  2. root有子节点,且子节点没有被访问过,则按右子节点、左子节点的顺序入栈
  3. root有子节点,且子节点都已经被访问过,则输出root
  • 为了判断root的子节点是否被访问过,保存前一个被访问的节点last,如果满足下面的条件就说明子节点被访问过
(!cur -> right && !cur -> left) || (!cur -> right && last == cur -> left) || (last == cur -> right)
  • 完整非递归实现
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> res;
        if(!root)
            return res;
        
        stack<TreeNode*> stk;
        stk.push(root);
        TreeNode* last = root;
        while(!stk.empty()) {
            TreeNode* cur = stk.top();
            if((!cur -> right && !cur -> left) || (!cur -> right && last == cur -> left) || (last == cur -> right)) {
                res.push_back(cur -> val);
                stk.pop();
                last = cur;
                continue;
            }
            if(cur -> right)
                stk.push(cur -> right);
            if(cur -> left)
                stk.push(cur -> left);
        }
        
        return res;
    }
};

猜你喜欢

转载自blog.csdn.net/zhwenx3/article/details/86746648