二叉树的中序遍历的实现
应用场景
可以用来做表达式树
实现方式
栈
- 遇到一个结点,就把它压栈,并去遍历它的左子树;
- 当左子树遍历结束后,从栈顶弹出这个结点并访问它;
- 然后按其右指针再去中序遍历该结点的右子树;;
时间复杂度:O(n)。
空间复杂度:O(n)
递归
- 中序遍历访问左子树;
- 访问根节点;
- 中序遍历访问右子树;
时间复杂度:O(n)。递归函数 T(n) = 2 \cdot T(n/2)+1T(n)=2⋅T(n/2)+1。
空间复杂度:最坏情况下需要空间O(n),平均情况为O(logn)。
源码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| import java.util.ArrayList; import java.util.List; import java.util.Stack;
class BTreeInorderTranversal94 {
public static List<Integer> traversalTreeInOrder_stack(TreeNode root) { List<Integer> nodes = new ArrayList<>(); Stack<TreeNode> stack = new Stack<>(); TreeNode curr = root; while (curr != null || !stack.isEmpty()) { while (curr != null) { stack.push(curr); curr = curr.left; } curr = stack.pop(); nodes.add(curr.val); curr = curr.right; } return nodes; }
public static void traversalTreeInOrder_recurse(List<Integer> nodes, TreeNode root) { if (root == null) { return; } if (root.left != null) { traversalTreeInOrder_recurse(nodes, root.left); } nodes.add(root.val); if (root.right != null) { traversalTreeInOrder_recurse(nodes, root.right); } }
public static class TreeNode { int val; TreeNode left; TreeNode right;
TreeNode(int val) { this.val = val; } } }
|