LeetCode:二叉樹的前序遍歷【144】
阿新 • • 發佈:2018-11-11
LeetCode:二叉樹的前序遍歷【144】
題目描述
給定一個二叉樹,返回它的 前序 遍歷。
示例:
輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,2,3]
題目分析
如果用遞迴程式碼的話,很簡單,先序遍歷,就是先遍歷當前節點,接著是左孩子然後是右孩子,到每個孩子都是這樣的處理過程。
public void preorder(TreeNode root,List<Integer> res) { if(root==null) return; res.add(root.val); preorder(root.left,res); preorder(root.right,res); }
但是這道題,我們可以用棧來模擬遞迴的過程,從而加深對遞迴的理解程度。隨便找一個二叉樹,我們來手工模擬一下這個出入棧過程:
剛開始的時候1在棧內,也在棧頂。列印完1以後,我們需要把它的兩個孩子加入到棧中,此時有一個問題,我們需要先加左還是先加右?
我們需要把下一個需要列印的元素髮在棧頂,如果先加左孩子的話,那麼右孩子就會處於棧頂,此時列印棧頂的話就是右孩子的值3,所以棧要先加右孩子,再加左孩子。
所以過程是:【1入棧】、1出棧列印輸出1
【3入棧、2入棧】,2出棧列印輸出2,然後【4入棧】,4出棧列印輸出4,3出棧列印輸出3.
Java題解
public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if(root==null) return res; Stack<TreeNode> stack = new Stack<>(); stack.push(root); while (!stack.empty()) { TreeNode node = stack.pop(); res.add(node.val); if(node.right!=null) stack.push(node.right); if(node.left!=null) stack.push(node.left); } return res; }