有序二叉树有两种遍历方法:
1、深度优先遍历
深度优先遍历又分为:1.先序遍历2.中序遍历3.后序遍历
如下代码为树的节点类:
public class TreeNode {
public TreeNode leftNode;
public TreeNode rightNode;
public Integer val;
public TreeNode(Integer val) {
this.val=val;
}
}
我们要通过下面的顺序对有序二叉树进行输出,通过递归是最好的方法。
递归表达式:startErfodic(TreeNode node),通过node传参为左节点或右节点进行值的输出
先序遍历顺序:父节点->左子节点->右子节点
因为是先输出父节点的值,我们就让输出在递归前面,通过以下代码递归的顺序可以控制输出的顺序
看如下代码:
//先序遍历
public void startErgodic(TreeNode node) {
//如果节点不是空节点就进行输出再进行递归
if(node!=null) {
System.out.print(node.val+" ");
startErgodic(node.leftNode);
startErgodic(node.rightNode);
}
}
中序遍历顺序:左子节点->父节点->右子节点
因为是中间输出父节点的值,我们就让输出在左子树递归后面,通过以下代码递归的顺序可以控制输出的顺序
//中序遍历
public void midErgodic(TreeNode node) {
if(node!=null) {
midErgodic(node.leftNode);
System.out.print(node.val+" ");
midErgodic(node.rightNode);
}
}
后序遍历顺序:左子节点->右子节点->父节点
因为是最后输出父节点的值,我们就让输出在右子树递归后面,通过以下代码递归的顺序可以控制输出的顺序
//后序遍历
public void endErgodic(TreeNode node) {
if(node!=null) {
endErgodic(node.leftNode);
endErgodic(node.rightNode);
System.out.print(node.val+" ");
}
}
2、广度优先遍历
即从上往下打印出二叉树的每个节点,同一层的节点按从左到右顺序打印
广度优先遍历需要用到先进先出的队列辅助
//广度优先遍历
public void Order() {
//通过jdk的接口类创建一个链表创建的队列,泛型内填入的是二叉树节点类型
LinkedList<TreeNode> queue=new LinkedList<>();
//队列进行入队
queue.push(root);
//判断队列是否为空
while(!queue.isEmpty()) {
//记录出队的值
TreeNode treeNode=queue.pop();
//输出出队的值
System.out.print(treeNode.val+" ");
//先遍历每层的左节点元素,不是空接着压入队列
if(treeNode.leftNode!=null) {
queue.push(treeNode.leftNode);
}
//后遍历每层的右节点元素,不是空接着压入队列
if(treeNode.rightNode!=null) {
queue.push(treeNode.rightNode);
}
}
}
测试类test进行对遍历代码进行测试:
public class Test {
public static void main(String[] args) {
BinaryTree binaryTree=new BinaryTree();
binaryTree.insert(1);
binaryTree.insert(2);
binaryTree.insert(3);
binaryTree.insert(4);
binaryTree.insert(5);
binaryTree.insertDigui(6, binaryTree.root);
binaryTree.insertDigui(7, binaryTree.root);
binaryTree.insertDigui(8, binaryTree.root);
binaryTree.insertDigui(9, binaryTree.root);
//广度优先遍历
binaryTree.Order();
System.out.println();
//先序遍历
binaryTree.startErgodic(binaryTree.root);
System.out.println();
//中序遍历
binaryTree.midErgodic(binaryTree.root);
System.out.println();
//后序遍历
binaryTree.endErgodic(binaryTree.root);
}
}
结果如下图: