Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)
生活随笔
收集整理的這篇文章主要介紹了
Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前序、中序、后序的含義
- 實例
- Code (遞歸)
- 前序遍歷
- 中序遍歷
- 后序遍歷
- 測試
- Code (非遞歸)
前序、中序、后序的含義
前序遍歷: 先輸出父節點,再遍歷左子樹,最后遍歷右子樹
中序遍歷 : 先遍歷左子樹,再輸出父節點,最后遍歷右子樹
后序遍歷 : 先遍歷左子樹,再遍歷右子樹,最后輸出父節點
如何區分呢?
看輸出父節點的順序 ,就可以確定是 前序、中序、后序
實例
我們先來分析下 將 下面的幾個數 放到 二分搜索樹中會是怎樣的存放 。
注意我們這里用的是二分搜索樹來演示二叉樹的這個遍歷,才會有中序遍歷的那個排序的特征。
5 / \ 3 6 / \ \ 2 4 8前序遍歷: 5 、3、2、4、6、8
中序遍歷: 2、3、4、5、6、8
后序遍歷 : 2、4、3、8、6、5
其實 , 前序遍歷比較常用。
觀察中序遍歷,可以看到是排序的 ,這個也很好理解。 畢竟是 左側的都是小于父節點的,右側都是大于父節點的。
后序遍歷的適用場景,舉個例子 為二分搜索樹釋放內存
前序遍歷、中序遍歷、后續遍歷本質上一種深度遍歷
Code (遞歸)
前序遍歷
/*** * * @Title: preOrder* * @Description: 二分搜索樹的前序遍歷* * * @return: void*/public void preOrder() {preOrder(root);}/*** * * @Title: preOrder* * @Description: 前序遍歷以node為根的二分搜索樹, 遞歸算法* * @param node* * @return: void*/private void preOrder(Node node) {if (node == null) // 終止條件return;System.out.print(node.e + "--"); // 先輸出父節點preOrder(node.left); // 再遍歷左子樹preOrder(node.right); // 最后遍歷又子樹}中序遍歷
/*** * * @Title: inOrder* * @Description: 二分搜索樹的中序遍歷* * * @return: void*/public void inOrder() {inOrder(root);}/*** * * @Title: inOrder* * @Description: 中序遍歷以node為根的二分搜索樹, 遞歸算法* * @param node* * @return: void*/private void inOrder(Node node) {if (node == null) // 終止條件return;inOrder(node.left);System.out.println(node.e);inOrder(node.right);}后序遍歷
/*** * * @Title: postOrder* * @Description: 二分搜索樹的后序遍歷* * * @return: void*/public void postOrder() {postOrder(root);}/*** * * @Title: postOrder* * @Description: 后序遍歷以node為根的二分搜索樹, 遞歸算法* * @param node* * @return: void*/private void postOrder(Node node) {if (node == null) // 終止條件return; postOrder(node.left);postOrder(node.right);System.out.println(node.e);}測試
public static void main(String[] args) {BinarySearchTree<Integer> bst = new BinarySearchTree<>();int[] nums = { 5, 3, 6, 8, 4, 2 };for (int num : nums) {bst.add(num);}bst.preOrder();System.out.println("============================");bst.inOrder();System.out.println("============================");bst.postOrder();}Code (非遞歸)
不用遞歸也可以實現,我們要借助Stack來實現這個。 推薦使用遞歸的方式,代碼更簡潔。
這里把不用遞歸的代碼也貼一下,供參考
/*** * * @Title: preOrderNR* * @Description: 二分搜索樹的前序遍歷 非遞歸的方式 棧是LIFO ,前序遍歷(先處理左子樹,后處理右子樹)* ,需要先把右節點入棧,這樣才能確保后處理* * @return: void*/public void preOrderNR() {Stack<Node> stack = new Stack<>();stack.push(root); // 把root入棧while (!stack.isEmpty()) {Node currentNode = stack.pop();System.out.println(currentNode.e);if (currentNode.right != null) {stack.push(currentNode.right);}if (currentNode.left != null) {stack.push(currentNode.left);}}}總結
以上是生活随笔為你收集整理的Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Algorithms_二叉树二分搜索树初
- 下一篇: Algorithms_二叉树的层次遍历(