中序遍历一个二叉树
Given a binary tree, return the inorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 \ 2 / 3
return [1,3,2]
.
Note: Recursive solution is trivial, could you do it iteratively?
用堆栈空间复杂度会达到O(n),所以采用别的方法。
采用中序二叉搜索树的方法可以将空间复杂度降到O(1),时间复杂度,如果能记录已经访问的节点时间复杂度可以为O(n),但是这样增加了空间复杂度(一个字节就可以记录一个节点是否访问,空间复杂度也低于用堆栈的方法),不记录访问过的节点,按照下面的代码时间复杂度最坏可以到O(n^2)。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> inorder = new ArrayList<Integer>();
while(root != null){
if(root.left != null){
TreeNode pre = root.left;
while(pre.right != null && pre.right != root){
pre = pre.right;
}
if(pre.right == null){
pre.right = root;
root = root.left;
}else{
inorder.add(root.val);
root = root.right;
}
}else{
inorder.add(root.val);
root = root.right;
}
}
return inorder;
}
}
代码优化以降低时间复杂度:
去看看leetcode 的discuss模块