leetcode----二叉树的后序遍历(递归和非递归)

(1)方法一:递归

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList
     */
    ArrayList<Integer> list = new ArrayList<>(); //注意:放在后序遍历函数外面
    public ArrayList<Integer> postorderTraversal (TreeNode root) {
        
        if(root!=null){
            
            postorderTraversal(root.left);
            postorderTraversal(root.right);
            list.add(root.val);
        }
        return list;
    }
}

(2)方法二:非递归

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */


public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList
          1
        2   3
         
     思路:前序:1 2 3 -> 1 3 2(左右孩子交换)-> 2 3 1(逆序) 等价于后序
          后序:2 3 1
          故:1.我们只需对该二叉树进行前序遍历,1 2 3 (将结点入栈1)
             2. 然后将其左右孩子交换,1 3 2 (取出栈1的结点放入栈2 ,并将取出结点的左右孩子放入栈1)
             3. 再获取逆序  2 3 1 (取出栈2的结点,完成逆置)
     */
    int MAXSIZE=1000;
    ArrayList<Integer> list = new ArrayList<>(); //存放遍历结果。
    TreeNode s1[] = new TreeNode[MAXSIZE];//栈1(树节点类型)
    TreeNode s2[] = new TreeNode[MAXSIZE];//栈2(树节点类型)
    int top1=-1;
    int top2=-1;
    public ArrayList<Integer> postorderTraversal (TreeNode root) {
        if(root==null){
            return list;
        }
        s1[++top1] = root;
        while(top1!=-1){
            TreeNode p = s1[top1--]; //将s1的结点出栈,入栈2
            s2[++top2] = p;
            if(p.left!=null){//出栈结点的左孩子不为空,入栈1
                s1[++top1] = p.left;
            }
            if(p.right!=null){//出栈结点的右孩子不为空,入栈1
                s1[++top1] = p.right;
            }
        }//while
        while(top2!=-1){//将栈2中的结点出栈
            list.add(s2[top2--].val);
        }//while
       return list;
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值