一、概述:
二叉樹,是一種非常重要的數據結構,屬於非線性結構;而在計算機程序中,“遍歷”本質上是一個線性的操作,所以 在遍歷二叉樹時,首先需要把非線性關聯的節點轉化成一個線性的序列,然後再以不同的方式遍歷,當然,遍歷的序列順序也不同。本篇文章主要講解“用遞歸思路實現二叉樹的前序、中序、後序遍歷的方式”,後面會繼續更新其他內容。
二、二叉樹的遍歷方式,如下圖:
三、用遞歸思路實現二叉樹的前序、中序、後序遍歷
首先,構建二叉樹節點
private static class TreeNode {
Integer data;
TreeNode leftChild;
TreeNode rightChild;
TreeNode(Integer data){
this.data = data;
}
}
其次,構建二叉樹
public static TreeNode creatBinaryTree(LinkedList<Integer> inputList) {
TreeNode node = null;
if(inputList == null || inputList.isEmpty()) {
return null;
}
Integer data = inputList.removeFirst();
//此處判空很關鍵:若元素爲空,則不再進行下一步遞歸
if(data != null) {
node = new TreeNode(data);
node.leftChild = creatBinaryTree(inputList);
node.rightChild = creatBinaryTree(inputList);
}
return node;
}
然後,用遞歸思路實現二叉樹的前序、中序、後序遍歷
1.前序遍歷--輸出順序:根節點、左節點、右節點
private static void preOrderTraverse(TreeNode treeNode){
if (treeNode == null)
return;
System.out.print(treeNode.data);
preOrderTraverse(treeNode.leftChild);
preOrderTraverse(treeNode.rightChild);
}
2.中序遍歷-輸出順序:左節點、根節點、右節點
private static void inOrderTraverse(TreeNode treeNode){
if (treeNode == null)
return;
inOrderTraverse(treeNode.leftChild);
System.out.print(treeNode.data);
inOrderTraverse(treeNode.rightChild);
}
3.後序遍歷-輸出順序:左節點、右節點、根節點
private static void postOrderTraverse(TreeNode treeNode){
if (treeNode == null)
return;
postOrderTraverse(treeNode.leftChild);
postOrderTraverse(treeNode.rightChild);
System.out.print(treeNode.data);
}
4.main方法進行輸出測試
public static void main(String[] args) {
List<Integer> asList = Arrays.asList(new Integer[] {3,2,9,null,null,10,null,null,8,null,4});
LinkedList<Integer> inputList = new LinkedList<Integer>(asList);
//構建二叉樹:此處把一個線性的鏈表轉化成非線性的二叉樹,鏈表節點的順序恰好是二叉樹前序遍歷的順序;
//鏈表中的空值,代表二叉樹節點的左孩子或右孩子爲空的情況;
TreeNode treeNode = creatBinaryTree(inputList);
System.out.println("前序遍歷:");
preOrderTraverse(treeNode);
System.out.println('\n'+"中序遍歷:");
inOrderTraverse(treeNode);
System.out.println('\n'+"後序遍歷:");
postOrderTraverse(treeNode);
}
附:自己總結的部分數據結構圖