您的位置:首页 > 其它

[leet code] Binary Tree Inorder Traversal

2014-01-04 10:32 302 查看
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: