leetcode94 二叉树的中序遍历

题目描述
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
   1
    \
     2
    /
   3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
 
	public List<Integer> inorderTraversal(TreeNode root) {
		List<Integer> list = new ArrayList<Integer>();
		inorder(root, list);
		return list;
	}

	/**
	 * 中序递归遍历
	 * @param root
	 * @param list
	 */
	public void inorder(TreeNode root, List<Integer> list) {
		if (root == null) {
			return;
		}
		inorder(root.left, list);
		list.add(root.val);
		inorder(root.right, list);
	}

	/**
	 * 中序非递归排序 使用栈来存储结点信息
	 * @param root
	 * @param list
	 */
	public void inorder1(TreeNode root, List<Integer> list) {
		Stack<TreeNode> stack = new Stack<TreeNode>();
		TreeNode p = root;
		while (p != null || !stack.isEmpty()) {
			if (p != null) {
				stack.push(p);
				p = p.left;
			} else {
				p = stack.pop();
				list.add(p.val);
				p = p.right;
			}
		}
	}

	/**
	 * 颜色标记法 中序非递归遍历
	 * 核心思想如下:
	   使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
	   如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
	   如果遇到的节点为灰色,则将节点的值输出
	 * @param root
	 * @param list
	 */
	public void inorder2(TreeNode root, List<Integer> list) {
		Stack<Object> stack = new Stack<Object>();
		stack.push(root);
		while (!stack.isEmpty()) {
			Object pop = stack.pop();
			if (pop == null) {
				continue;
			}
			if (pop instanceof TreeNode) {
				TreeNode tmp = (TreeNode) pop;
				stack.push(tmp.right);
				stack.push(tmp.val);
				stack.push(tmp.left);
			} else {
				list.add((Integer) pop);
			}
		}
	}

  

posted on 2020-10-12 17:03  lkjhgfdsa123  阅读(112)  评论(0编辑  收藏  举报