leetcode 145. Binary Tree Postorder Traversal

来源:互联网 发布:手机 dns劫持 数据网络 编辑:程序博客网 时间:2024/05/24 06:50

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?

后根遍历指:首先遍历左子树,然后遍历右子树,最后遍历访问根结点。

不许用递归了,那我就用的栈。把 某个结点的左右子树是否访问 记录下来。

public List<Integer> postorderTraversal(TreeNode root) {List<Integer> list=new ArrayList<Integer>();if(root==null){return list;}Stack<TreeNodeUsed> stack=new Stack<>();stack.push(new TreeNodeUsed(root));while(!stack.isEmpty()){TreeNodeUsed nodeUsed=stack.pop();if(nodeUsed.leftUsed==true&&nodeUsed.rightUsed==true){list.add(nodeUsed.node.val);}else{nodeUsed.rightUsed=true;nodeUsed.leftUsed=true;stack.push(nodeUsed);if(nodeUsed.node.right!=null){stack.push(new TreeNodeUsed(nodeUsed.node.right));}if(nodeUsed.node.left!=null){stack.push(new TreeNodeUsed(nodeUsed.node.left));}}}return list;}class TreeNodeUsed{TreeNode node;boolean leftUsed;boolean rightUsed;public TreeNodeUsed(TreeNode n){node=n;leftUsed=false;rightUsed=false;}}
有大神也用的栈,但是方法比我简洁得多:
public List<Integer> postorderTraversal(TreeNode root) {LinkedList<Integer> ans = new LinkedList<>();Stack<TreeNode> stack = new Stack<>();if (root == null) return ans;stack.push(root);while (!stack.isEmpty()) {TreeNode cur = stack.pop();ans.addFirst(cur.val);if (cur.left != null) {stack.push(cur.left);}if (cur.right != null) {stack.push(cur.right);} }return ans;}
精髓在于"add first",把数字添加到链表的最前部。这样先被pop出来的node值反而会写在结果链表的后面。我们只要使栈pop出来的顺序是 根->右->左,这样出来的结果链表的顺序就自然的反向,成为 左->右->根。

原创粉丝点击