Java迭代实现二叉树的前序、中序、后序遍历

冷不防 2022-08-07 06:52 212阅读 0赞

我们都知道,二叉树的遍历有三种形式:前序遍历、中序遍历、后序遍历,三种遍历的规则分别如下:

1)前序遍历:先遍历根节点,然后遍历左子节点,最后遍历右子节点,简记为“根-左-右”;

2)中序遍历:先遍历左子节点,然后遍历根节点,最后遍历右子节点,简记为“左-根-右”;

3)后序遍历:先遍历左子节点,然后遍历右子节点,最后遍历根节点,简记为“左-右-根”;

根据遍历规则,我们可以采用“递归”的方式很快的实现,这些程序相对比较简单,我在这里就不一一写了,今天主要写一下通过迭代的方式实现二叉树的三种遍历。

二叉树的定义如下:

  1. <span style="font-size:14px;">public class TreeNode {
  2. int val;
  3. TreeNode left;
  4. TreeNode right;
  5. TreeNode(int x) {
  6. val = x;
  7. }
  8. }</span>

在使用迭代的方式遍历的过程中,需要维护一个栈用来保存遍历的节点信息,同时在程序中维护了一个List用来保存树节点对应的值,相应代码如下所示:

前序遍历:

  1. public class PreorderTraversal {
  2. List<Integer> result = new ArrayList<Integer>();
  3. /**
  4. * 迭代实现,维护一个栈,因为入栈顺序按照根右左进行入栈,因此首先将根出栈,然后出栈左子节点,
  5. * 最后出栈右子节点。
  6. * @param root
  7. * @return
  8. */
  9. public List<Integer> preorderTraversal(TreeNode root) {
  10. if(root == null)
  11. return result;
  12. Stack<TreeNode> stack = new Stack<TreeNode>();
  13. stack.push(root);
  14. while(!stack.isEmpty()) {
  15. TreeNode node = stack.pop();
  16. result.add(node.val);
  17. if(node.right != null)
  18. stack.push(node.right);
  19. if(node.left != null)
  20. stack.push(node.left);
  21. }
  22. return result;
  23. }
  24. }

中序遍历:

  1. public class InorderTraversal {
  2. private List<Integer> result = new ArrayList<Integer>();
  3. /**
  4. * 迭代实现,首先依次将左子节点全部加入栈中,所以第一个while循环后栈顶元素对应一个子树的最
  5. * 左子节点,然后将该元素出栈加入list,并判断该元素的遍历该节点的右子树。
  6. * @param root
  7. * @return
  8. */
  9. public List<Integer> inorderTraversal(TreeNode root) {
  10. if(root == null)
  11. return result;
  12. Stack<TreeNode> stack = new Stack<TreeNode>();
  13. do {
  14. //依次将左节点均加入栈中
  15. while(root != null) {
  16. stack.push(root);
  17. root = root.left;
  18. }
  19. if (!stack.isEmpty()) {
  20. root = stack.pop();
  21. result.add(root.val);
  22. root = root.right;
  23. }
  24. } while(!stack.isEmpty() || root != null);
  25. return result;
  26. }
  27. }

后序遍历:

  1. public class PostorderTraversal {
  2. private List<Integer> result = new ArrayList<Integer>();
  3. /**
  4. * 迭代实现,使用栈实现,出栈得到节点顺序为根右左,每次向list最开头插入元素
  5. * @param root
  6. * @return
  7. */
  8. public List<Integer> postorderTraversal(TreeNode root) {
  9. if(root == null)
  10. return result;
  11. Stack<TreeNode> stack = new Stack<TreeNode>();
  12. stack.push(root); //首先将根节点压栈
  13. while(!stack.isEmpty()) {
  14. TreeNode ele = stack.pop(); //首先出栈的为根节点,其后先出右子节点,后出左子节点
  15. if(ele.left != null)
  16. stack.push(ele.left); //将左子节点压栈
  17. if(ele.right != null) {
  18. stack.push(ele.right); //将右子节点压栈
  19. }
  20. result.add(0, ele.val); //因为出栈顺序为“根右左”,所以需要每次将元素插入list开头
  21. }
  22. return result;
  23. }
  24. }

发表评论

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

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

相关阅读