日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)

發布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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_二叉树的前序遍历、中序遍历、后续遍历(深度优先)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。