我不讨厌算法不讨厌算法,才见了鬼。
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,null,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
补个基础: 树的遍历,有前序(根左右),中序(左根右),后序(左右根)。
大佬说这个不要递归比较好,让我背下来算法,那就背吧!(反正递归我也不会~)
算法:
1. 把根节点push到栈中(例子是1)
再补个基础:Java有个方法Object push(Object element)把项压入堆栈顶部。
Object pop( )移除堆栈顶部的对象,并作为此函数的值返回该对象。
、 stack是后进先出(记得方法就是啪啪,stick插进去就要拔出来才出得来,换做队列就要捅穿了才出得来)
2. 循环检测栈是否为空,若不空,则取出栈顶元素,保存其值,然后看其右子节点是否存在,若存在则push到栈中。再看其左子节点,若存在,则push到栈中。(先压右边,再压左边,这样拿出来,先拿的左边,符合根-左右)
代码:
import java.util.ArrayList; import java.util.List; import java.util.Stack; class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } class Solution { public List<Integer> preorderTraversal(TreeNode root) { Stack<TreeNode> stack = new Stack<TreeNode>(); List<Integer> preorder = new ArrayList<Integer>(); if (root == null) { return preorder; } stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); preorder.add(node.val); if (node.right != null) { stack.push(node.right); } if (node.left != null) { stack.push(node.left); } } return preorder; } public static void main(String[] args) { TreeNode myTreeNode_root=new TreeNode(1); TreeNode myTreeNode_2=new TreeNode(2); TreeNode myTreeNode_3=new TreeNode(3); myTreeNode_root.left=null; myTreeNode_root.right=myTreeNode_2; myTreeNode_2.left=myTreeNode_3; Solution mysolution=new Solution(); mysolution.preorderTraversal(myTreeNode_root); } }