LeetCode筆記——94中序遍歷
題目:
給定一個二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3] 1 \ 2 / 3 輸出: [1,3,2]
進階: 遞迴演算法很簡單,你可以通過迭代演算法完成嗎?
思路:網上大神的程式碼,原文連結:https://blog.csdn.net/baidu_32045201/article/details/79768083
首先中序遍歷二叉樹就是先遍歷左子樹,再遍歷根節點,最後是右子樹。以下的程式碼使用迭代的思想(重複執行一段程式)。
使用一個棧stack存放節點,使用list存放遍歷的結果。主要分為幾下幾個步驟:
(1)把當前非空節點放入棧中
(2)如果左節點不為空,將其放入棧中
(3)如果左節點為空,則將棧中已有的元素出棧,並記錄在list中
(4)將非空有節點加入到棧中
重複以上過程知道棧中的元素為空(迭代停止的條件)
補充一些其他大神對迭代和遞迴的理解:
(1)遞迴:程式呼叫自己的程式設計技巧叫做遞迴。遞迴做為一種演算法在程式設計語言中廣泛應用。 一個過程或函式在其定義
或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小
的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少了程式的程式碼量
(2)迭代:重複反饋過程的活動,其目的通常是為了逼近所需目標或結果。每一次對過程的重複稱為一次“迭代”,
而每一次迭代得到的結果會作為下一次迭代的初始值。
遞迴的特點:主要分為兩步(1)一直進行知道到達限制條件(一直呼叫自己)
(2)回溯結果
程式碼:
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new ArrayList<>();
while(true){
if (root != null){
stack.push(root);
root = root.left;
}
else {
if (stack.empty()) {
return list;
}
root = stack.pop();
list.add(root.val);
root = root.right;
}
}
}
}
執行最快的程式碼:
以下好像是個遞迴的思想。
class Solution {
List<Integer> res = new ArrayList();
public void add(TreeNode root){
if(root == null)
return ;
else{
add(root.left);
res.add(root.val);
add(root.right);
}
}
public List<Integer> inorderTraversal(TreeNode root) {
if(root == null)
return res;
add(root);
return res;
}
}