Leetcode---中序遍歷二叉樹--遞迴和非遞迴
阿新 • • 發佈:2018-12-05
中序遍歷二叉樹
題目連結:中序遍歷二叉樹
解法一:
遞迴遍歷比較簡單
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
inorderTraversal(root,result);
return result;
}
public void inorderTraversal(TreeNode root,List<Integer> list) {
if (root==null) {
return;
}
inorderTraversal(root.left,list);
list.add(root.val);
inorderTraversal(root.right,list);
}
解法二:
- 非遞迴遍歷:
- 如果是尾遞迴一般可以直接修改為迴圈結構,例如斐波那契數列
- 二叉樹不是尾遞迴,採用手動壓棧,彈棧遍歷
- 解題過程中遇到的問題有,迴圈的終止條件是什麼?起初我寫的是棧結構為空則結束遍歷,這裡出現了問題,中序遍歷時:遍歷完左子樹就需要彈棧了,如果彈出的為根節點,那麼此時棧中已經沒有節點,但是還有根節點的右子樹沒有遍歷,所以終止條件為:stack!=空||當前指標指向!=null
- 我採取的是有左子樹就壓棧當前節點,而不是當前節點不為空就壓棧,兩者在遍歷過程上有小的區別
- 彈棧之後的做法,既然是彈棧說明左子樹已經遍歷完,那麼接下來就是遍歷當前彈出的節點,再接著是遍歷其右子樹,這裡不必判斷右子樹是否為空,直接指標指到右子樹就可以了,搭配迴圈終止條件,為空時剛好可以使其退出迴圈,不為空繼續彈棧
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null) {
return new ArrayList<Integer>();
}
Stack< TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
TreeNode move = root;
while(!stack.isEmpty()||move!=null) {
if(move!=null) {
if(move.left!=null) {
stack.push(move);
move = move.left;
continue;
}
result.add(move.val);
move = move.right;
}
if(!stack.isEmpty()&&move==null) {
move = stack.pop();
result.add(move.val);
move = move.right;
}
}
return result;
}