1. 程式人生 > >【LeetCode】Binary Tree Postorder Traversal 二叉樹後序遍歷遞迴以及非遞迴演算法

【LeetCode】Binary Tree Postorder Traversal 二叉樹後序遍歷遞迴以及非遞迴演算法


Total Accepted: 15614 Total Submissions: 50928 My Submissions
Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3},
   1
    \
     2
    /
   3
return[3,2,1].
Note: Recursive solution is trivial, could you do it iteratively?
【解題思路】
1、遞迴 左右中

Java AC

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private ArrayList<Integer> list;
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        list = new ArrayList<Integer>();
        postOrder(root);
        return list;
    }
    private void postOrder(TreeNode root){
        if(root == null){
            return;
        }
        postOrder(root.left);
        postOrder(root.right);
        list.add(root.val);
    }
}
2、非遞迴
1)、需要先查詢到當前節點的最左孩子,也就是一直入棧。
2)、假設到node時,左孩子為空了,這個時候出棧,棧頂元素就是當前節點node。
3)、判斷棧頂元素是否為空,如果為空,說明可以直接訪問根節點了,直接加入list中。
4)、如果不為空,說明需要訪問右孩子,這個時候,注意將當前節點元素new一個出來,同時入棧,這一步其實是儲存根節點值的。再回到1)重複處理,直到棧為空。

Java AC

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    private ArrayList<Integer> list;
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        list = new ArrayList<Integer>();
        postOrder(root);
        return list;
    }
    private void postOrder(TreeNode root){
        Stack<TreeNode> stack = new Stack<TreeNode>();
        while(root != null || !stack.isEmpty()){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            while(!stack.isEmpty()){
                root = stack.pop();
                if(root.right != null){
                	stack.push(new TreeNode(root.val));
                    root = root.right;
                    break;
                }
                list.add(root.val);
                if (stack.isEmpty()) {
					return;
				}
            }
        }
    }
}

相關推薦

LeetCodeBinary Tree Postorder Traversal 以及演算法

Total Accepted: 15614 Total Submissions: 50928 My Submissions Given a binary tree, return the postorder traversal of its nodes' values.

LeetCodeBinary Tree Inorder Traversal 以及演算法

  Total Accepted: 16494 Total Submissions: 47494 Given a binary tree, return the inorder traversal of its nodes' values. For example: Giv

LeetCodeBinary Tree Preorder Traversal 以及演算法

  Total Accepted: 17403 Total Submissions: 50093 My Submissions Given a binary tree, return the preorder traversal of its nodes' values.

LeetCode144. Binary Tree Preorder Traversal 實現

題目: 翻譯:給定一個二叉樹,返回先序遍歷的序列。 分析:二叉樹的先序遍歷、中序遍歷及後序遍歷演算法是資料結構中最基礎的遍歷演算法。             先序遍歷:先訪問根節點的資料,再訪問左孩子節點的資料,最後訪問右孩子節點的資料。圖中例子先序遍歷輸出的序列為:【

binary-tree-inorder-traversal——

str () init inorder code while urn value public Given a binary tree, return the inordertraversal of its nodes‘ values. For example:Given

Leetcode 94. Binary Tree Inorder Traversalt ()

原題 Given a binary tree, return the inorder traversal of its nodes’ values. Example: Input: [1,null,2,3] 1 \ 2 / 3 Output

LeetCodeBinary Tree Postorder Traversal

Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,null,2

[LeetCode] Binary Tree Postorder Traversal

Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 \ 2 /

LeetCode 94.Binary Tree Inorder Traversal (的中)

題目描述: 給定一個二叉樹,返回它的中序 遍歷。 示例: 輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,3,2] 進階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎? AC C++ Solution

[LeetCode] Binary Tree Level Order Traversal

Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level). For example:Given binary tree {3,9

Binary Tree Postorder Traversal 實現

Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 \ 2 / 3 return 

LeetCode 94. Binary Tree Inorder Traversal 的中 C++

壓入 rsa return recursive 使用 rdquo push cto 方法 Given a binary tree, return the inorder traversal of its nodes‘ values. Example: Input:

LeetCode 144. Binary Tree Preorder Traversal 的前 C++

do it emp 二叉 c++ pre value code val right Given a binary tree, return the preorder traversal of its nodes‘ values. Example: Input: [1

LeetCode Hard 145 Python

def postorderTraversal(self, root): """ 記住得了= = 就訪問當前root,然後左子樹入棧,右子樹入棧,最後逆序一下就好了,return output[::-1] 相當於是這麼個思路: 目標:左右根

leetcode 145+590 (iterative)(附589,144,94)

題目描述 145. Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes' values. Example: Input: [1,nu

--歸與歸實現

eno oid imp array ins hashmap nod package 實現 package tree; import java.util.ArrayList; import java.util.HashMap; import java.util.List;

實現(java)

後序遍歷:雙棧法,和層次遍歷(雙佇列)很相似,唯一區別在於層次遍歷用的 是佇列,後序遍歷用的是棧。 public static void posOrderUnRecur1(Node head){ System.out.print("PosOrder:"); if(head !=

(關鍵詞:////搜尋/根搜尋)

後序遍歷二叉樹 遞迴演算法 def postorderTraversal(root): f = postorderTraversal return f(root.left) + f(root.right) + [root.val] if root is not None el

--演算法

後續遍歷關鍵在於,當節點的  右子樹存在且被訪問後  或者是  右子樹為空  才能訪問自身。 在遍歷過程中,先將節點從的左孩子到最左節點壓棧, 設定標誌變數 flag 來判斷是否訪問過左孩子, pre指標來指向先前訪問過的節點。 所有左孩子壓棧後, 最後一個節點的左孩子為空,已被訪問p = NULL , 令f

演算法及C語言實現

二叉樹後序遍歷的實現思想是:從根節點出發,依次遍歷各節點的左右子樹,直到當前節點左右子樹遍歷完成後,才訪問該節點元素。 圖 1 二叉樹   如圖 1 中,對此二叉樹進行後序遍歷的操作過程為: 從根節點 1 開始,遍歷該節點的左子樹(以節點 2 為根節點); 遍歷節點 2 的左子樹(以節點 4 為根