56.Binary Tree Preorder Traversal
2016-01-12 18:07
323 查看
Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree
return
分析:先序遍历输出二叉树的元素节点。
方法一:采用迭代的思想;
方法二:采用自己思考之后的迭代算法;
方法三:参考别人的一个比较好的迭代算法。
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; }
相关文章推荐
- pthread_cond_t, pthread_cond_broadcast()与 pthread_mutex_t
- Java设计模式 建造模式(Builder)
- 关于ImportError: xxxx.so: undefined symbol: PyFPE_jbuf的解决方案
- 低功耗蓝牙4.0BLE编程-nrf51822开发(5)-链路层
- android5.1 MT6735 编译过程
- MySQL手册 DATE_ADD() 函数向日期添加指定的时间间隔。
- 低功耗蓝牙4.0BLE编程-nrf51822开发(4)
- 关于html5里object、embed、video、audio的小总结
- iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button
- C# Emit动态代理生成一个实体对象
- WEBADI权限设置
- vxbox共享文件夹设置后ubuntu自动加载mount
- 低功耗蓝牙4.0BLE编程-nrf51822开发(3)
- 嵌入式系统的BootLoader技术浅析_启动过程
- 三步教会你装系统
- linux的文件类型和权限
- 在virtualbox里把Ubuntu下安装的中文输入法切换出来
- Windows7 下编译 OSGEarth
- git rebase vs git merge
- JS中的toFixed()四舍五入方法