遞歸實現二叉樹的三種遍歷

一、概述:

二叉樹,是一種非常重要的數據結構,屬於非線性結構;而在計算機程序中,“遍歷”本質上是一個線性的操作,所以 在遍歷二叉樹時,首先需要把非線性關聯的節點轉化成一個線性的序列,然後再以不同的方式遍歷,當然,遍歷的序列順序也不同。本篇文章主要講解“用遞歸思路實現二叉樹的前序、中序、後序遍歷的方式”,後面會繼續更新其他內容。

二、二叉樹的遍歷方式,如下圖:

三、用遞歸思路實現二叉樹的前序、中序、後序遍歷

首先,構建二叉樹節點

	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);
	}

 

附:自己總結的部分數據結構圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章