leetcode刷题之旅(145)二叉树的后序遍历

题目描述

给定一个二叉树,返回它的 后序 遍历。

 

样例

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [3,2,1]

 

思路分析

方法一:递归,按照后序遍历“左右根”的顺序,依次遍历,递归即可

方法二:循环写法,写法类似先序和中序,但添加的list时用了头插,实际遍历顺序为右根左

方法三:利用双栈,一个栈进行右根左的遍历,另一栈保存值,由于是先进后出,出栈顺序就是后序遍历的顺序了

 

代码及结果

方法一:

public List<Integer> postorderTraversal(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (root == null) {
			return list;
		}
		return postorderTraversal(root, list);
	}
	public List<Integer> postorderTraversal(TreeNode root,ArrayList<Integer> list) {
		if (root != null) {
			if (root.left != null) {
				postorderTraversal(root.left, list);
			}
			if (root.right != null) {
				postorderTraversal(root.right, list);
			}
			list.add(root.val);
		}
		return list;
	}

方法二:

public List<Integer> postorderTraversal(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (root == null) {
			return list;
		}
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode temp = root;
		while (!stack.isEmpty() || temp != null) {
            while (temp != null) {
                stack.push(temp);
                list.add(0, temp.val);
                temp = temp.right;
            } 
            
                temp = stack.pop();
                temp = temp.left;           
            
        }
		return list;
	}

方法三:

public List<Integer> postorderTraversal(TreeNode root) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		if (root == null) {
			return list;
		}
		Stack<TreeNode> stack1 = new Stack<TreeNode>();
		Stack<TreeNode> stack2 = new Stack<TreeNode>();
		stack1.push(root);
		TreeNode temp;
		while (!stack1.isEmpty()) {
			temp = stack1.pop();
			if (temp.left != null) {
				stack1.push(temp.left);
			}
			if (temp.right != null) {
				stack1.push(temp.right);
			}
			stack2.push(temp);
		}
		while (!stack2.isEmpty()) {
			temp = stack2.pop();
			list.add(temp.val);
		}
		return list;
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值