二叉树的中序遍历(递归和非递归版本)

深藏阁楼爱情的钟 2022-10-01 10:58 194阅读 0赞

难易程度:★★

重要性:★★★★★

树结构是面试中的考察的重点,而树的遍历又是树结构的基础。中序遍历的非递归版本要求重点理解掌握。

  1. /**
  2. * 非递归版本的中序遍历
  3. * node指向待处理的节点,在中序遍历中如果要输出一个节点,要么该节点没有左孩子,要么该节点的左子树已经全部输出了。
  4. *所以:
  5. *1.当node为null时,表示暂时没有新节点处理,此时出栈一个节点(表明该节点没有左子树或者左子树全部处理了);
  6. * 这时只需要继续处理右子树即可, 中序是“左根右”:我们先入栈 根节点 ,如果有左节点则入栈左节点,
  7. * 否则出栈根节点(没有左节点则输出遍历根节点),之后处理右子树
  8. *2.当node不为null时,将node入栈,并将node指向node.left,表明要处理当前节点必须先处理左子树节点
  9. *
  10. * @param root:根节点
  11. */
  12. public static List<Integer> midOrderTraverse(TreeNode root) {
  13. LinkedList<Integer> res = new LinkedList<Integer>();
  14. if (root == null)
  15. return res;
  16. Stack<TreeNode> aux = new Stack<TreeNode>();
  17. TreeNode node = root;//node指向待处理节点
  18. while (node != null || !aux.isEmpty()) {
  19. while (node != null) {
  20. //当前节点不为null,将当前节点入栈等到该节点的左子树全部处理完后在处理当前节点
  21. aux.add(node);
  22. node = node.left;//先处理左孩子节点
  23. }
  24. TreeNode temp = aux.pop();
  25. res.add(temp.val);//node没有左孩子,则输出当前node节点
  26. node = temp.right;//处理node的右子树
  27. }
  28. return res;
  29. }
  30. /**
  31. * 中序遍历,递归版本
  32. * @param root
  33. * @return
  34. */
  35. public static ArrayList<Integer> midOrderTraverse(TreeNode root) {
  36. ArrayList<Integer> res = new ArrayList<Integer>();
  37. midOrderTraverse(root, res);
  38. return res;
  39. }
  40. private static void midOrderTraverse(TreeNode root, ArrayList<Integer> res) {
  41. if (root == null)
  42. return;
  43. preOrder(root.left);
  44. res.add(root.val);
  45. preOrder(root.right);
  46. }
  47. 复制代码

扫描下方二维码,及时获取更多互联网求职面经javapython爬虫大数据等技术,和海量资料分享:公众号**菜鸟名企梦后台回复“csdn”即可免费领取【csdn】和【百度文库】下载服务;公众号菜鸟名企梦后台回复“资料”:即可领取5T精品学习资料**、java面试考点java面经总结,以及几十个java、大数据项目资料很全,你想找的几乎都有

转载于:https://juejin.im/post/5cbd75e4f265da03a22f6421

发表评论

表情:
评论列表 (有 0 条评论,194人围观)

还没有评论,来说两句吧...

相关阅读