【中序遍歷二叉樹】----LeetCode算法題(二)

1、題目基本信息

題目傳送門--中序遍歷二叉樹bash

級別:【中等】
/**
 * 【中序遍歷二叉樹】給定一個二叉樹,返回它的中序 遍歷。
 * 
 * 示例:
 * 
 * 輸入: [1,null,2,3] 
 * 1
 *  \
 *   2
 *  /
 * 3 
 * 輸出: [1,3,2]
 * 
 * 遞歸方式遍歷感受比迭代遍歷快
 * @Author jiawei huang
 * @Since 2019年8月12日
 * @Version 1.0
 */
複製代碼

2、解題思路

  • 一、最廣泛的方式就是遞歸,二叉樹天生就很是適合遞歸。
  • 二、迭代遍歷,利用循環,藉助棧將迭代的中間結果保存下來,通常迭代須要有一個指向當前位置的相似指針的東西。

3、代碼演示

【解法一】ui

/**
 * 1ms,小編本身的解法,遞歸中序遍歷
 * 
 * @param root
 * @return
 */
public List<Integer> treeMiddleTraverse(TreeNode root) {
    // 若是左子樹不爲空,那就遍歷作子樹
    if (root.left != null) {
    	treeMiddleTraverse(root.left);
    }
    
    // 二、左子樹遍歷完後,取中間節點
    list.add(root.val);
    
    // 三、若是右子樹不爲空,那就遍歷右子樹
    if (root.right != null) {
    	treeMiddleTraverse(root.right);
    }
    return list;
}

/**
 * 1ms遞歸方式中序遍歷
 * 
 * @param root
 * @return
 */
public List<Integer> inorderTraversal(TreeNode root) {
    if (null == root) {
    	return new ArrayList<>();
    }
    return treeMiddleTraverse(root);
}
複製代碼

【解法二】spa

/**
 * 2ms迭代方式遍歷
 * 
 * @param nums
 * @param target
 * @return
 */
public List<Integer> inorderTraversal(TreeNode root) {
    if (root == null) {
    	return list;
    }
    // 藉助棧
    Stack<TreeNode> mStack = new Stack<>();
    
    // 一、迭代須要有一個遊標
    TreeNode currentNode = root;
    // 二、迭代的條件
    while (currentNode != null || !mStack.isEmpty()) {
    	// 左子樹遍歷
    	while (currentNode != null) {
            mStack.push(currentNode);
            currentNode = currentNode.left;
    	}
    	// 中
    	currentNode = mStack.pop();
    	list.add(currentNode.val);
    	currentNode = currentNode.right;
    }
    return list;
}
複製代碼

感受迭代遍歷方式比遞歸耗時一些指針

相關文章
相關標籤/搜索