Java面试--二叉树的遍历

本文详细介绍了二叉树的前序、中序和后序遍历,包括遍历顺序和示例,并提供了相应的Java代码实现。同时,讨论了在二叉搜索树中如何寻找中序遍历的下一个节点,以及后序遍历的应用。文章最后分析了遍历算法的时间复杂度。

二叉树的遍历

一、前序遍历

遍历顺序:先前序遍历树根,再前序遍历左子树,再前序遍历右子树

先遍历树根(A)--再遍历左子树(B)--再遍历左子树(D)--(D没有左子树了)再遍历右子树(E)--再遍历左子树(G)--(A没有左子树了)再遍历右子树(C)--(C没有左子树了)再遍历右子树(F) ;故顺序为 A-B-D-E-G-C-F;

 

二、中序遍历

遍历顺序:先中序遍历左子树,再遍历树根,再中序遍历右子树

先遍历左子树(D)--再遍历其父元素(B)--再遍历右子树(E)--再遍历左子树(G)--再遍历树根(A)--(A没有左子树了)再遍历右子树(C)--(C没有左子树了)再遍历右子树(F) ;故顺序为 D-B-G-E-A-C-F;

 

三、后序遍历

遍历顺序:先后序遍历左子树,再后序遍历右子树,再遍历树根

先遍历左子树(D)--再遍历左子树(G)--再遍历其父元素(E)--再遍历其父元素(B)--再遍历右子树(F)--在遍历其父元素(C)--再遍历s树根(A) ;故顺序为 D-G-E-B-F-C-A;

代码实现:

定义树节点 TreeNode.java

package interview.tree;

public class TreeNode {
  private final char value;
  private TreeNode left;
  private TreeNode right;
  private TreeNode parent;

  public TreeNode(char value) { //定义树的节点
    this.value = value;
    this.left = null;
    this.right = null;
    this.parent = null;
  } 

  public char getValue() {
    return value;
  }

  public TreeNode getLeft() {
    return left;
  }

  public void setLeft(TreeNode left) {
    this.left = left;
    if (this.left != null) {
      this.left.setParent(this);
    }
  }

  public TreeNode getRight() {
    return right;
  }

  public void setRight(TreeNode right) {
    this.right = right;
    if (this.right != null) {
      this.right.setParent(this);
    }
  }

  public TreeNode getParent() {
    return parent;
  }

  private void setParent(TreeNode parent) {
    this.parent = parent;
  }
}

定义二叉树 TreeCreater.java

package interview.tree;

public 
### Java二叉树序、中序和后序遍历Java中,可以通过递归方式实现二叉树的三种主要遍历方法:遍历、中序遍历以及后序遍历。 #### 遍历 遍历遵循访问顺序为 **根节点 -> 左子树 -> 右子树** 的原则。以下是其实现代码: ```java public class TreeNode { int value; TreeNode left; TreeNode right; public TreeNode(int value) { this.value = value; this.left = null; this.right = null; } } public class BinaryTree { public void preOrder(TreeNode node) { if (node == null) { return; } System.out.print(node.value + " "); // 处理根节点 preOrder(node.left); // 递归遍历左子树 preOrder(node.right); // 递归遍历右子树 } } ``` 上述代码展示了如何通过递归完成遍历操作[^1]。 #### 中序遍历 中序遍历按照 **左子树 -> 根节点 -> 右子树** 的顺序执行。其具体实现如下所示: ```java public class BinaryTree { public void inOrder(TreeNode node) { if (node == null) { return; } inOrder(node.left); // 递归遍历左子树 System.out.print(node.value + " "); // 处理根节点 inOrder(node.right); // 递归遍历右子树 } } ``` 此部分逻辑基于递归调用,先处理左侧分支再打印当节点值并继续右侧分支的操作[^2]。 #### 后序遍历 对于后序遍历而言,则需依照 **左子树 -> 右子树 -> 根节点** 这样的路径来展开工作流程。下面给出对应的算法描述及其编码形式: ```java public class BinaryTree { public void postOrder(TreeNode node) { if (node == null) { return; } postOrder(node.left); // 递归遍历左子树 postOrder(node.right); // 递归遍历右子树 System.out.print(node.value + " "); // 处理根节点 } } ``` 这段程序片段清楚地表明了后序遍历过程中各阶段的任务安排情况。 以上就是利用Java语言针对二叉树结构分别实施序、中序及后序这三种不同类型的遍历策略的具体做法说明。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值