56.Binary Tree Preorder Traversal

来源:互联网 发布:mac网络测速工具 编辑:程序博客网 时间:2024/05/29 14:28

Given a binary tree, return the preorder traversal of its nodes' values.

For example:
Given binary tree {1,#,2,3},

   1    \     2    /   3

return [1,2,3].

分析:先序遍历输出二叉树的元素节点。

方法一:采用迭代的思想;

方法二:采用自己思考之后的迭代算法;

方法三:参考别人的一个比较好的迭代算法。

/* 采用递归的思想 * Step1:首先判断root是否为空,为空则结束 * Step2:root的结果加入到结果中,然后遍历左子树和右子树 */public List<Integer> preorderTraversal(TreeNode root) {List<Integer> list = new ArrayList<Integer>();if(root == null){return list;}else{list.add(root.val);list.addAll(preorderTraversal(root.left));list.addAll(preorderTraversal(root.right));}return list;}/* 采用迭代的方式先序遍历 * 利用栈来存放二叉树中的元素。 * Step1:首先把根节点放到stack和list中。然后进行如下循环操作,知道stack为空。 * Step2:对放到栈中的每一个元素都必须先把其最左边所有分之的节点放到栈中,同时把放到栈中每个元素都加入到list中,作为结果返回; * Step3:然后取出栈顶元素,判断其右节点是否为空,不为空的情况下把它加入到stack中和list中。 */public List<Integer> preorderTraversal2(TreeNode root) {List<Integer> list = new ArrayList<Integer>();if(root == null){return list;}else{TreeNode node = root; Stack stack = new Stack();stack.push(node);list.add(root.val);while(!stack.isEmpty()){while(node.left != null){node = node.left;list.add(node.val);//把遇到的根节点都加入到list中stack.push(node);}System.out.println("stack.size() = "+stack.size());TreeNode popnode= (TreeNode) stack.pop();//弹出栈顶元素System.out.println("popnode "+popnode.val);if(popnode.right != null){node = popnode.right;stack.push(node);list.add(node.val);//把遇到的根节点都加入到list中}}}return list;}/* 迭代的思想,参考网上的 * 与方法二中自己想的一样,保留一个stack和list. * 充分利用栈的性质,先进后出。往stack中弹出一个元素之后依次压入其右节点和左节点。这样在弹栈的时候必然是先拿到其左节点的值,将其加入到list中, * 然后再依次压入其右节点和左节点。 */public List<Integer> preorderTraversal3(TreeNode root) {List<Integer> list = new ArrayList<Integer>();if(root == null){return list;}else{TreeNode node = root; Stack stack = new Stack();stack.push(node);while(!stack.isEmpty()){TreeNode popnode= (TreeNode) stack.pop();//弹出栈顶元素list.add(popnode.val);if(popnode.right != null){stack.push(popnode.right);}if(popnode.left != null){stack.push(popnode.left);}}}return list;}



0 0