java实现二叉树的遍历(递归和非递归)

刺骨的言语ヽ痛彻心扉 2022-05-30 07:20 274阅读 0赞

源码地址:
https://github.com/TimePickerWang/aimed-at-offer/blob/master/java%E6%BA%90%E7%A0%81/TreeInfo.java

现有一颗如下图所示的二叉树:

这里写图片描述

其遍历的各种方式如下:

这里写图片描述
这里写图片描述

构造一颗如下图所示的二叉树,用java实现其前序,中序,后序遍历

这里写图片描述

注意二叉树节点的定义如下:

  1. public class TreeNode {
  2. int val;
  3. TreeNode left;
  4. TreeNode right;
  5. TreeNode(int x) {
  6. val = x;
  7. }
  8. }

递归实现:

  1. // 用递归的方法进行先序遍历
  2. public void qinaxuDigui(TreeNode treeNode) {
  3. qianxuNumList.add(treeNode.val);
  4. if (treeNode.left != null) {
  5. qinaxuDigui(treeNode.left);
  6. }
  7. if (treeNode.right != null) {
  8. qinaxuDigui(treeNode.right);
  9. }
  10. }
  11. // 用递归的方法进行中序遍历
  12. public void zhongxuDigui(TreeNode treeNode) {
  13. if (treeNode.left != null) {
  14. zhongxuDigui(treeNode.left);
  15. }
  16. zhongxuNumList.add(treeNode.val);
  17. if (treeNode.right != null) {
  18. zhongxuDigui(treeNode.right);
  19. }
  20. }
  21. // 用递归的方法进行后序遍历
  22. public void houxuDigui(TreeNode treeNode) {
  23. if (treeNode.left != null) {
  24. houxuDigui(treeNode.left);
  25. }
  26. if (treeNode.right != null) {
  27. houxuDigui(treeNode.right);
  28. }
  29. houxuNumList.add(treeNode.val);
  30. }

非递归实现:

  1. // 用非递归的方法进行先序遍历
  2. public void qinaxuFeiDigui(TreeNode treeNode) {
  3. Stack<TreeNode> stack = new Stack<TreeNode>();
  4. while (treeNode != null || !stack.isEmpty()) {
  5. while (treeNode != null) {
  6. qianxuNumList.add(treeNode.val);
  7. stack.push(treeNode);
  8. treeNode = treeNode.left;
  9. }
  10. if(!stack.isEmpty()){
  11. treeNode = stack.pop();
  12. treeNode = treeNode.right;
  13. }
  14. }
  15. }
  16. // 用非递归的方法进行中序遍历
  17. public void zhongxuFeiDigui(TreeNode treeNode) {
  18. Stack<TreeNode> stack = new Stack<TreeNode>();
  19. while (treeNode != null || !stack.isEmpty()) {
  20. while (treeNode != null) {
  21. stack.push(treeNode);
  22. treeNode = treeNode.left;
  23. }
  24. if (!stack.isEmpty()) {
  25. treeNode = stack.pop();
  26. zhongxuNumList.add(treeNode.val);
  27. treeNode = treeNode.right;
  28. }
  29. }
  30. }
  31. // 用非递归的方法进行后序遍历
  32. public void houxuFeiDigui(TreeNode treeNode) {
  33. Stack<TreeNode> stack = new Stack<TreeNode>();
  34. while (treeNode != null || !stack.isEmpty()) {
  35. while (treeNode != null) {
  36. stack.push(treeNode);
  37. treeNode = treeNode.left;
  38. }
  39. boolean tag = true;
  40. TreeNode preNode = null; // 前驱节点
  41. while (!stack.isEmpty() && tag == true) {
  42. treeNode = stack.peek();
  43. if (treeNode.right == preNode) { // 之前访问的为空节点或是栈顶节点的右子节点
  44. treeNode = stack.pop();
  45. houxuNumList.add(treeNode.val);
  46. if (stack.isEmpty()) {
  47. return;
  48. } else {
  49. preNode = treeNode;
  50. }
  51. } else {
  52. treeNode = treeNode.right;
  53. tag = false;
  54. }
  55. }
  56. }
  57. }

运行结果如下:

这里写图片描述

发表评论

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

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

相关阅读