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;
	}

猜你喜欢

转载自blog.csdn.net/sun10081/article/details/82821102