本文记录,采用递归方式进行树的前中后序遍历。本质是走过树的所有节点。
【扩展】前中后序是深度遍历。以前序为例子
在满二叉树的前提下,中序遍历:首先要到达到左侧树的最底部,找到最低的左节点,然后回退到其父节点,找到父节点的右子节点,进行右节点遍历,然后又回退到父节点。依次往复遍历整个树。这递归中也包含了回溯的过程。
package cn.msf.tree;
import java.util.ArrayList;
import java.util.List;
/**
* @author : msf
* @date : 2022/12/2
* 采用递归方法进行树的前,中,后遍历。
*/
public class InorderTraversal {
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
root.right = node1;
node1.left = node2;
InorderTraversal inorderTraversal = new InorderTraversal();
List<Integer> result = inorderTraversal.inorderTraversal(root);
List<Integer> result1 = inorderTraversal.inorderTraversal(root);
List<Integer> result2 = inorderTraversal.postorderTraversal(root);
System.out.println(result);
System.out.println(result1);
System.out.println(result2);
}
/**
* 中序遍历
* @param root
* @return
*/
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
inorder(list,root);
return list;
}
private void inorder(List<Integer> list, TreeNode root) {
if (root == null) {
return;
}
list.add(root.value);
inorder(list,root.left);
inorder(list,root.right);
}
/**
* 前序遍历
* @param root
* @return
*/
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
preorder(list,root);
return list;
}
private void preorder(List<Integer> list, TreeNode root) {
if (root == null) {
return;
}
preorder(list,root.left);
list.add(root.value);
preorder(list,root.right);
}
/**
* 后序遍历
* @param root
* @return
*/
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
postorder(list,root);
return list;
}
private void postorder(List<Integer> list, TreeNode root) {
if (root == null) {
return;
}
postorder(list,root.left);
postorder(list,root.right);
list.add(root.value);
}
}