題目傳送門--中序遍歷二叉樹bash
級別:【中等】
/**
* 【中序遍歷二叉樹】給定一個二叉樹,返回它的中序 遍歷。
*
* 示例:
*
* 輸入: [1,null,2,3]
* 1
* \
* 2
* /
* 3
* 輸出: [1,3,2]
*
* 遞歸方式遍歷感受比迭代遍歷快
* @Author jiawei huang
* @Since 2019年8月12日
* @Version 1.0
*/
複製代碼
【解法一】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;
}
複製代碼
感受迭代遍歷方式比遞歸耗時一些指針