【Java資料結構與演算法筆記(二)】樹的四種遍歷方式(遞迴&非遞迴)

alicelmx發表於2019-03-11

這也是暑期實習的準備之一,最近進入了演算法題的整理階段,感覺提升了很多,後期還會更新的。
這個只含有程式碼和必要的解釋,如果你看不懂的話,建議先把資料結構課本看一下~

後序遍歷(⚠️非遞迴的trick)

遞迴版

import java.util.*;
public class Solution {
    ArrayList<Integer> res = new ArrayList<Integer>();
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        if(root!=null){
            postorderTraversal(root.left);
            postorderTraversal(root.right);
            res.add(root.val);
        }
        return res;
    }
}

利用棧

由於先序遍歷的順序是(根,左,右),後序遍歷的順序是(左,右,根),我們可以考慮這樣一種方法:將先序遍歷改為(根,右,左),然後在將其逆置即可,逆置我們採取的方法是 add(0,num),即可實現逆置。

import java.util.*;
public class Solution {
    ArrayList<Integer> res = new ArrayList<Integer>();
    public ArrayList<Integer> postorderTraversal(TreeNode root) {
        if(root==null)
            return res;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            res.add(0,tmp.val);
            if(tmp.left!=null)
                stack.push(tmp.left);
            if(tmp.right!=null)
                stack.push(tmp.right);
        }
        return res;
    }
}

先序遍歷

遞迴

import java.util.*;
public class Solution {
    ArrayList<Integer> res = new ArrayList<Integer>();
    public ArrayList<Integer> preorderTraversal(TreeNode root) {
        if(root!=null){
            res.add(root.val);
            preorderTraversal(root.left);
            preorderTraversal(root.right);
        }
        return res;
    }
}

藉助棧實現非遞迴寫法

import java.util.*;
public class Solution {
    public ArrayList<Integer> preorderTraversal(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(root==null)
            return res;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        stack.push(root);
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            res.add(tmp.val);
            if(tmp.right!=null)
                stack.push(tmp.right);
            if(tmp.left!=null)
                stack.push(tmp.left);
        }
        return res;
    }
}

中序遍歷

遞迴

import java.util.*;
public class Solution {
    ArrayList<Integer> res = new ArrayList<Integer>();
    public ArrayList<Integer> inorderTraversal(TreeNode root) {
        if(root!=null){
            inorderTraversal(root.left);
            res.add(root.val);
            inorderTraversal(root.right);
            
        }
        return res;
    }
}

使用棧

import java.util.*;
public class Solution {
    ArrayList<Integer> res = new ArrayList<Integer>();
    public ArrayList<Integer> inorderTraversal(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode node = root;
        while(node!=null){
            stack.push(node);
            node = node.left;
        }
        while(!stack.isEmpty()){
            TreeNode tmp = stack.pop();
            res.add(tmp.val);
            if(tmp.right!=null){
                TreeNode n = tmp.right;
                while(n!=null){
                    stack.push(n);
                    n = n.left;
                }
            }
        }
        return res;
    }
}

層次遍歷

import java.util.ArrayList;
import java.util.LinkedList;

public class Solution {
    public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(root==null) return res;
        LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();
            res.add(node.val);
            if(node.left!=null) queue.add(node.left);
            if(node.right!=null) queue.add(node.right);
        }
        
        return res;
    }
}

相關文章