1. 程式人生 > >Leetcode---中序遍歷二叉樹--遞迴和非遞迴

Leetcode---中序遍歷二叉樹--遞迴和非遞迴

中序遍歷二叉樹

題目連結:中序遍歷二叉樹

解法一:

遞迴遍歷比較簡單

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; }