LeetCode-94. 二叉樹的中序遍歷
給定一個二叉樹,返回它的中序 遍歷。
示例:
輸入: [1,null,2,3]
1
\
2
/
3
輸出: [1,3,2]
思路
分爲遞歸版本和非遞歸版本。
遞歸
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**
遞歸版本
*/
class Solution {
List<Integer> res=new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null)
{
return res;
}
res=(inorderTraversal(root.left));
res.add(root.val);
res=(inorderTraversal(root.right));
return res;
}
}
非遞歸
中序遍歷的順序是左根右,而我們只能從root開始,要麼向左遍歷,要麼向右遍歷。我們可以先一直向左遍歷,直到某個葉子節點,然後將遍歷過程中的所有節點存入一個棧中。
接下來要看看這個葉子節點的右子樹,對它的右子樹,我們依然按照上述步驟來一遍。
如果它沒有右子樹,就出棧,繼續看這個出棧的節點有木有右子樹。
用一個變量指針和一個棧就可以搞定。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**非遞歸版本*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res=new ArrayList<Integer>();
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=root;
while(cur!=null || !stack.isEmpty())
{
while(cur!=null)
{
stack.push(cur);
cur=cur.left;
}
cur=stack.pop();
res.add(cur.val);
//複用指針,cur要麼是空,如果不是空,就重複以上步驟,壓入以cur爲根的子樹的所有左邊節點。
//一個非空節點就能代表一棵樹
cur=cur.right;
}
return res;
}
}