飞道的博客

【LintCode 题解】腾讯算法面试题:二叉树的前序遍历

252人阅读  评论(0)

题目描述

给出一棵二叉树,返回其节点值的前序遍历。

  • 首个数据为根节点,后面接着是其左儿子和右儿子节点值,"#"表示不存在该子节点。

  • 节点数量不超过20

样例 1:


  
  1. 输入:{1,2,3}
  2. 输出:[1,2,3]
  3. 解释:
  4. 1
  5. / \
  6. 2 3
  7. 它将被序列化为{1,2,3}
  8. 前序遍历

样例 2:


  
  1. 输入:{ 1, #,2,3}
  2. 输出:[ 1, 2, 3]
  3. 解释:
  4. 1
  5. \
  6. 2
  7. /
  8. 3
  9. 它将被序列化为{ 1, #,2,3}
  10. 前序遍历

题解

非递归方式实现前序遍历时,首先存入当前节点值,然后先将右儿子压入栈中,再将左儿子压入栈中。对栈中元素遍历访问。

国内大厂面试除了操作系统和计算机网络这些基础外,还需要熟练掌握算法和数据结构。自己刷题来准备的话至少需要3个月的时间,当然通过算法课程,一般能节省大把时间,快的话一个月时间就能应对大厂算法面试。


  
  1. Version 0: Non-Recursion (Recommend)
  2. /**
  3. * Definition for binary tree
  4. * public class TreeNode {
  5. * int val;
  6. * TreeNode left;
  7. * TreeNode right;
  8. * TreeNode(int x) { val = x; }
  9. * }
  10. */
  11. public class Solution {
  12. public List<Integer> preorderTraversal(TreeNode root) {
  13. Stack<TreeNode> stack = new Stack<TreeNode>();
  14. List<Integer> preorder = new ArrayList<Integer>();
  15. if (root == null) {
  16. return preorder;
  17. }
  18. stack.push(root);
  19. while (!stack.empty()) {
  20. TreeNode node = stack.pop();
  21. preorder.add(node.val);
  22. if (node.right != null) {
  23. stack.push(node.right);
  24. }
  25. if (node.left != null) {
  26. stack.push(node.left);
  27. }
  28. }
  29. return preorder;
  30. }
  31. }
  32. //Version 1: Traverse
  33. public class Solution {
  34. public ArrayList<Integer> preorderTraversal(TreeNode root) {
  35. ArrayList<Integer> result = new ArrayList<Integer>();
  36. traverse(root, result);
  37. return result;
  38. }
  39. // 把root为跟的preorder加入result里面
  40. private void traverse(TreeNode root, ArrayList<Integer> result) {
  41. if (root == null) {
  42. return;
  43. }
  44. result.add(root.val);
  45. traverse(root.left, result);
  46. traverse(root.right, result);
  47. }
  48. }
  49. //Version 2: Divide & Conquer
  50. public class Solution {
  51. public ArrayList<Integer> preorderTraversal(TreeNode root) {
  52. ArrayList<Integer> result = new ArrayList<Integer>();
  53. // null or leaf
  54. if (root == null) {
  55. return result;
  56. }
  57. // Divide
  58. ArrayList<Integer> left = preorderTraversal(root.left);
  59. ArrayList<Integer> right = preorderTraversal(root.right);
  60. // Conquer
  61. result.add(root.val);
  62. result.addAll(left);
  63. result.addAll(right);
  64. return result;
  65. }
  66. }

 


转载:https://blog.csdn.net/JiuZhang_ninechapter/article/details/104479854
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场