二叉树的遍历
二叉树的遍历是值按照一定顺序访问二叉树中所有结点的过程,确保每个结点被访问且仅被访问一次。遍历操作是对二叉树的基础操作,用于后续的查找、排序和路径计算等功能。
二叉树的遍历有以下几种常见方式:深度遍历(DFS)和广度遍历,其中深度遍历分为先序遍历,中序遍历,后序遍历,先、中、后表示对根节点的访问顺序。
二叉树的深度遍历
二叉树的深度遍历是按照树的深度方向进行访问的遍历方式,即尽可能深入到树的某一分支,指导无法继续为止,然后回溯并继续访问其他分支。
深度遍历的关键在于利用递归或栈来记录访问的路径。使用递归的方式可以在栈中保存当前结点,访问结点后再出栈。
递归注意递归规律和递归出口。
对于树:
结点和二叉树:
java
// TreeNode.java
// 结点类
public class TreeNode{
public int data;
public TreeNode left;
public TreeNode right;
public TreeNode(int data) {
this.data=data;
}
// 数据的类型决定数据在内存中的存储形式
@Override
public String toString() {
return "TreeNode{" +
"data = "+ data +
"\n, left = " + left +
", right = "+ right+"}";
}
}
//BalanceTree.java
public class BalanceTree {
// 虚拟根节点
public TreeNode root;
// 构建二叉树
public void insert(int data) {
TreeNode newnode = new TreeNode(data);
if(root==null) {
root = newnode;
return;
}
TreeNode currentNode = root;
while(true) {
if(newnode.data<currentNode.data) {
if(currentNode.left!=null) {
currentNode=currentNode.left;
}
else {
currentNode.left=newnode;
return;
}
}else {
if(currentNode.right!= null) {
currentNode=currentNode.right;
}else {
currentNode.right=newnode;
return;
}
}
}
}
}
先序遍历
先序遍历的顺序:根 -- 左 -- 右
遍历顺序为: 9 2 1 5 4 3 7 6 8 9
java
// 递归实现先序遍历
public void beforeOrder(TreeNode root) {
TreeNode temp = root;
if(temp==null) {
return;
}
System.out.print(" " + temp.data);
beforeOrder(temp.left);
beforeOrder(temp.right);
}
中序遍历
中序遍历顺序:左 -- 根 -- 右
遍历顺序为: 1 2 3 4 5 6 7 8 9 9
java
// 递归实现中序遍历
public void inOrder(TreeNode root) {
if(root==null) {
return;
}
inOrder(root.left);
System.out.print(" " + root.data);
inOrder(root.right);
}
后序遍历
后序遍历顺序:左 -- 右 -- 根
遍历顺序为:1 3 4 6 8 7 5 2 9 9
java
// 递归实现后序遍历
public void afterOrder(TreeNode root) {
if(root==null) {
return;
}
afterOrder(root.left);
afterOrder(root.right);
System.out.print(" " + root.data);
}
广度优先遍历
使用队列,先把根节点压入队列,再把左右两结点压入队列当中。输出结点后,结点出队,将队列中的下一结点的左右两结点压入队列中,输出结点,结点出队,以此类推。
遍历顺序为:9 2 9 1 5 4 7 3 6 8
java
// 广度遍历
public void levelOrder() {
LinkedList<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()) {
TreeNode node= queue.pop();
System.out.print(node.data+" ");
if(node.left!=null) {
queue.add(node.left);
}
if(node.right!=null) {
queue.add(node.right);
}
}
}