Leetcode binary-tree-postorder 二叉树后续遍历

题目描述

 

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

For example:
Given binary tree{1,#,2,3},

   1
    \
     2
    /
   3

 

return[3,2,1].

Note: Recursive solution is trivial, could you do it iteratively?

题目要求使用非递归(迭代)的方式来解决该问题。

解法一:递归(>_<)

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
public class Solution {
    private ArrayList<Integer> result;
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        result = new ArrayList<Integer>();
        preorder(root);
        return result;
    }
    private void preorder(TreeNode root)
    {
        if(root!=null)
        {
            preorder(root.left);
            preorder(root.right);
            result.add(root.val);
        }
    }
}

解法二:非递归

使用两个栈进行处理,方法简单,代码易懂。>_<

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.Stack;
import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        ArrayList<Integer> result = new ArrayList();
        if(root == null)
            return result;
        Stack<TreeNode> stack1 = new Stack();
        Stack<TreeNode> stack2 = new Stack();
        stack1.push(root);
        TreeNode tmpNode = null;
        while(!stack1.isEmpty()){
            tmpNode = stack1.pop();
            if(tmpNode.left!=null)
                stack1.push(tmpNode.left);
            if(tmpNode.right!=null)
                stack1.push(tmpNode.right);
            stack2.push(tmpNode);
        }
        while(!stack2.isEmpty()){
            result.add(stack2.pop().val);
        }
        return result;
    }
}

stack2中存放的是后序遍历输出的整个顺序。stack1中先入跟然后入左和入右,这样stack1先pop跟,然后pop右,接着pop左;正好Stack2先入跟,右,左,故,stack2循环pop的时候就是【左右跟】的形式

解法3:

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 **/
 import java.util.ArrayList;
 import java.util.Stack;
import java.util.LinkedList;
public class Solution {
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        LinkedList<Integer> result = new LinkedList<Integer>();
        if(root == null)
            return new ArrayList(result);
        Stack<TreeNode> stack = new Stack();
        TreeNode tmpNode = root;
        while(!stack.isEmpty() || tmpNode!=null)
        {
            if(tmpNode!=null)
            {
                stack.push(tmpNode);
                result.addFirst(tmpNode.val);
                tmpNode = tmpNode.right;
            }else
            {
                tmpNode = stack.pop().left;
            }
        }
        return new ArrayList(result);
    }
}

该方法类似于方法二。代码中使用LinkedList,该数据结构的实现是基于链表的,所以有addFirst()方法,反之,基于数组实现的ArrayList则没有该方法,两者之间可以通过构造方法进行转换。

解法4:

该方法类似于方法2,使用一个链表和一个栈,类似于根,后,前的输出方式。但是dayin为前后跟的形式。

代码如下

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        LinkedList<Integer> list = new LinkedList();
        if(root == null)
            return new ArrayList(list);
        Stack<TreeNode> stack = new Stack();
        stack.push(root);
        TreeNode tmpNode = null;
        while(!stack.isEmpty()){
            tmpNode = stack.pop();
            list.addFirst(tmpNode.val);
            if(tmpNode.left!=null)
                stack.push(tmpNode.left);
            if(tmpNode.right!=null)
                stack.push(tmpNode.right);
        }
        return new ArrayList(list);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值