任务描述
在上一关,我们实现了二叉树的前序遍历,本关我们将实现二叉树的中序遍历。
本关任务:实现以二叉链表存储的二叉树的中序遍历算法。
相关知识
二叉树的相关知识请参考上一关。
二叉树的中序遍历
中序遍历二叉树时,对结点的访问次序为中序序列,即首先访问左子树,再访问根结点,最后访问右子树。 上图二叉树的中序遍历结果为:0 4 5 3 6 7
。
中序遍历次序示意图如下:
中序遍历的递归算法定义如下: 若二叉树非空,则: (1)
遍历左子树; (2)
访问根结点; (3)
遍历右子树。
编程要求
本关的编程任务是补全右侧代码片段中Begin
至End
中间的代码,具体要求如下:
- 补全
inOrder(TreeNode root)
方法,实现二叉树的中序遍历功能,并输出结点的值。
具体请参见后续测试样例。
- 平台将创建用户补全后的
BinaryTree
类的对象, - 调用对象的
createTree(int arr[])
方法,用arr
中的数据构建二叉树,并返回根结点, - 调用对象的
inOrder(TreeNode root)
方法,进行中序遍历并输出结点值, - 接着根据程序的输出判断程序是否正确。
注意一下:测试输入解释部分和实际输入有不同的 ,但是不影响测试结果和实际输出
本关涉及的代码文件BinaryTree.java
的代码(答案 大家可以有序拿走,创作不易,打赏助力支持是我前进的动力 予星河)
package step2;
/**
* Created by zengpeng on 2018/2/12.
YJH YJH YJH 予星河
*/
public class BinaryTree {
private TreeNode root;//根节点
public BinaryTree() {
root = null;
}
public void inOrder(TreeNode root) {
/********** YJH YJH YJH 予星河 Begin *********/
if(root==null){
return;
}
inOrder(root.leftChild);
System.out.println(root.item);
inOrder(root.rightChild);
/**********YJH YJH YJH 予星河 End *********/
}
/**
* 以数组arr的数据,依次从上至下,从左至右构建一颗二叉树
*
* @param arr
* @param n
* @return
*/
public TreeNode createTree(int arr[]) {
TreeNode tmp[] = new TreeNode[arr.length + 1];
for (int k = 1; k <= arr.length; k++) {
TreeNode node = new TreeNode(arr[k - 1]);
tmp[k] = node;
if (k == 1) {
root = node;
} else {
int j = k / 2;
if (k % 2 == 0) {
tmp[j].leftChild = node;
} else {
tmp[j].rightChild = node;
}
}
}
return root;
}
public static class TreeNode {
private TreeNode leftChild;
private TreeNode rightChild;
private int item;
public TreeNode(int item) {
this(null, null, item);
}
public TreeNode(TreeNode leftChild, TreeNode rightChild, int item) {
this.leftChild = leftChild;
this.rightChild = rightChild;
this.item = item;
}
}
}
致谢:JAVA数据结构启蒙导师陶虹妃老师
感谢一路浏览支持的友友(创作不易 支持一下我们的梦想和动力 )
感谢予星河动力不竭的源泉(YJH Myself)