无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

歡迎光臨散文網 會員登陸 & 注冊

Java如何實現遞歸?

2023-02-17 17:06 作者:YSOcean  | 我要投稿

在Java中,二叉樹的后序遍歷可以使用遞歸或迭代的方式進行實現。

  1. 遞歸實現

遞歸實現后序遍歷的思路是先遞歸訪問當前節(jié)點的左子樹,再遞歸訪問右子樹,最后訪問當前節(jié)點本身。

下面是一個遞歸實現的示例代碼:

public void postOrderTraversal(TreeNode root) { ? ?if (root != null) { ? ? ? ?postOrderTraversal(root.left); ? ? ? ?postOrderTraversal(root.right); ? ? ? ?System.out.print(root.val + " "); ? ?}}

在上述代碼中,postOrderTraversal()方法是一個遞歸方法,它首先遞歸訪問當前節(jié)點的左子樹,然后遞歸訪問右子樹,最后訪問當前節(jié)點本身。

  1. 迭代實現

迭代實現后序遍歷的思路是使用棧來保存待訪問的節(jié)點。首先將根節(jié)點入棧,然后循環(huán)執(zhí)行以下操作:

  • 從棧頂取出一個節(jié)點,如果該節(jié)點沒有子節(jié)點或者其子節(jié)點已經被訪問過,則訪問該節(jié)點并將其從棧中彈出;

  • 如果該節(jié)點有子節(jié)點且子節(jié)點尚未被訪問過,則依次將其右子節(jié)點、左子節(jié)點入棧。

下面是一個迭代實現的示例代碼:

public void postOrderTraversal(TreeNode root) {

? ? Stack<TreeNode> stack = new Stack<>();

? ? TreeNode lastVisited = null; // 記錄上一個訪問的節(jié)點

? ? while (root != null || !stack.isEmpty()) {

? ? ? ? // 將左子節(jié)點入棧

? ? ? ? if (root != null) {

? ? ? ? ? ? stack.push(root);

? ? ? ? ? ? root = root.left;

? ? ? ? }

? ? ? ? else {

? ? ? ? ? ? TreeNode peekNode = stack.peek();

? ? ? ? ? ? // 如果該節(jié)點沒有右子節(jié)點或者右子節(jié)點已經被訪問過,則訪問該節(jié)點并將其從棧中彈出

? ? ? ? ? ? if (peekNode.right == null || peekNode.right == lastVisited) {

? ? ? ? ? ? ? ? System.out.print(peekNode.val + " ");

? ? ? ? ? ? ? ? lastVisited = stack.pop();

? ? ? ? ? ? }

? ? ? ? ? ? // 否則將右子節(jié)點入棧

? ? ? ? ? ? else {

? ? ? ? ? ? ? ? root = peekNode.right;

? ? ? ? ? ? }

? ? ? ? }

? ? }

}

在上述代碼中,postOrderTraversal()方法是一個迭代方法,它使用了一個棧來保存待訪問的節(jié)點,并使用lastVisited變量來記錄上一個訪問的節(jié)點。在循環(huán)中,如果當前節(jié)點沒有左子節(jié)點,則從棧頂取出一個節(jié)點并訪問它;否則將左子節(jié)點入棧。如果當前節(jié)點沒有右子節(jié)點或者右子節(jié)點已經被訪問過,則訪問該節(jié)點并將其從棧中彈出;否則將右子節(jié)點入棧。

Java如何實現遞歸?的評論 (共 條)

分享到微博請遵守國家法律
仁化县| 石景山区| 定日县| 孙吴县| 嘉峪关市| 邵阳县| 荣昌县| 麟游县| 固原市| 娄烦县| 关岭| 南木林县| 镇远县| 奉节县| 唐河县| 高邮市| 江阴市| 原平市| 昌吉市| 越西县| 广东省| 邹城市| 鄂托克前旗| 岐山县| 扎鲁特旗| 黄大仙区| 瓮安县| 都昌县| 台东市| 资阳市| 晋江市| 甘洛县| 白河县| 徐闻县| 石景山区| 灌云县| 丹凤县| 阿合奇县| 秭归县| 略阳县| 宜兴市|