二叉树算法设计:
递归:先写终止条件,然后明确一个结点要做的事(包含递归操作)
遍历:遍历每一个结点
深度优先遍历DFS:preOrder, midOrder, postOrder,midReverseOrder
一般递归(也可用栈)实现
广度优先遍历BFS:levelOrder
队列+循环实现
BST 二叉搜索树/二叉排序树/二叉查找树:左孩子<root<右孩子
对于BST:
按小大顺序打印:中序遍历
按大小顺序打印:中序的倒遍历
- 先序遍历: 先访问根节点
若二叉树为空则结束返回,否则:
(1)访问根结点。
(2)前序遍历左子树。
(3)前序遍历右子树
public void preOrder(TreeNode root) {
对每个结点要干的事//System.out.println(root.val)
preOrder(root.left);
preOrder(root.right);
return;
}
- 中序遍历:中间访问根节点
若二叉树为空则结束返回,否则:
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
public void midOrder(TreeNode root) {
midOrder(root.left);
对每个结点要干的事//System.out.println(root.val)
midOrder(root.right);
return;
}
- 后序遍历
若二叉树为空则结束返回,否则:
(1)中序遍历左子树
(2)中序遍历右子树
(3)访问根结点
public void postOrder(TreeNode root) {
postOrder(root.left);
postOrder(root.right);
对每个结点要干的事//System.out.println(root.val)
return;
}
- 中序的倒遍历:中间访问根节点
若二叉树为空则结束返回,否则:
(1)中序遍历右子树
(2)访问根结点
(3)中序遍历左子树
public void midReverseOrder(TreeNode root) {
midReverseOrder(root.right);
对每个结点要干的事//System.out.println(root.val)
midReverseOrder(root.left);
return;
}
- 层次遍历:
1.对于不为空的结点,先把该结点加入到队列中
2.从队中拿出结点,如果该结点的左右结点不为空,就分别把左右结点加入到队列中
3.重复以上操作直到队列为空
import java.util.*;
public void levelOrder(TreeNode root) {
if(root==null) return;
//如果有root不为空
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
TreeNode node = null;
//队列不为空
while(!q.isEmpyt()){
node=q.poll();
对每个结点要干的事//System.out.println(node.val)
//把不为空的子字节插入队列
if (node.left!=null) q.offer(node.left);
if (node.right!=null) q.offer(node.right);
}
return ;
}