二叉树的后序遍历

145 二叉树的后序遍历

后序遍历,先访问左子树然后访问右子树然后访问根节点。

 C++代码

/**
 * 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> postorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> s;
        TreeNode* cur = root;
        TreeNode* pre = NULL;
//迭代写法,利用pre记录上一个访问过的结点,与当前结点比较,如果是当前结点的子节点,说明其左右结点均已访问,将当前结点出栈,更新pre记录的对象。 s.push(cur);
while(!s.empty()&&cur!=NULL){ cur = s.top(); if((cur->right==NULL && cur->left==NULL)|| (pre!=NULL&&(pre==cur->left||pre==cur->right))){ v.push_back(cur->val); s.pop(); pre = cur; }else{ if(cur->right!=NULL){ s.push(cur->right); } if(cur->left!=NULL){ s.push(cur->left); } } } return v; } };

java代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> s = new Stack<>();
        s.push(root);
        TreeNode cur = root;
        TreeNode pre = null;
        while(!s.isEmpty()&&cur!=null){
            cur = s.peek();
            if((cur.left==null&&cur.right==null)||
               ((pre!=null)&&(pre==cur.left||pre==cur.right))){
                list.add(cur.val);
                s.pop();
                pre = cur;
            }else{
                if(cur.right!=null){
                    s.push(cur.right);
                }
                if(cur.left!=null){
                    s.push(cur.left);
                }
            }
        }
        return list;
    }
}

 

posted @ 2019-05-07 21:15  +D  阅读(394)  评论(0编辑  收藏  举报