Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
思路与 Binary Tree Preorder Traversal 相像. 如果使用递归, 则只需要更改节点值提取顺序. 顺序改为: 左子节点值->节点值->右节点值
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> nodeVal = new ArrayList<Integer>();
if (root == null) return nodeVal;
TreeNode node = root;
inOrder(nodeVal, node);
return nodeVal;
}
public void inOrder(ArrayList<Integer> nodeVal, TreeNode node){
if (node.left != null) inOrder(nodeVal, node.left);
nodeVal.add(node.val);
if (node.right != null) inOrder(nodeVal, node.right);
}
}
如果不用递归, 参考 Binary Tree Preorder Traversal 可以利用栈进出实现inorder. 需要铭记在心的是, 对于每一个节点, 顺序永远是左子节点值->节点->右子节点值. 于是, 当检验任意节点时, 如果有左子节点, 则将当前节点压入栈中, 并进而检验该节点左子树, 不断重复该操作直到栈清空且当前节点指向null. 这时可以提取储存在栈中最顶端的节点 (该节点为中节点), 并检查其右子树. (该做法思路来自网上)
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public ArrayList<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> nodeVal = new ArrayList<Integer>();
Stack<TreeNode> st = new Stack();
if (root == null) return nodeVal;
TreeNode node = root;
while (!st.isEmpty() || node != null){
//left node exist
if (node != null){
st.push(node);
node = node.left;
}
else {
// locate to the last unextract middle node
node = st.peek();
nodeVal.add(node.val);
st.pop();
node = node.right;
}
}
return nodeVal;
}
}