admin 管理员组

文章数量: 887021

收藏

参考力扣题解
作者:hzhu212
链接:/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

此思路复杂度低,且简洁易懂,对于前序、中序、后序遍历,能够写出完全一致的代码,只需要调整左右节点的入栈顺序即可。
(注:由于栈FIFO的特性,入栈顺序应与遍历顺序相反,如中序遍历为左、中、右,则入栈顺序为右、中、左。)

核心思想如下:

  • 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
  • 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依 次入栈。
  • 如果遇到的节点为灰色,则将节点的值输出。
public class 二叉树的中序遍历_94 {class ColorNode {TreeNode node;String color;public ColorNode(TreeNode node, String color) {this.node = node;this.color = color;}}public List<Integer> inorderTraversal(TreeNode root) {if (root == null) {return new ArrayList<Integer>();}List<Integer> res = new ArrayList<>();Stack<ColorNode> stack = new Stack<>();stack.push(new ColorNode(root, "white"));while (!stack.empty()) {ColorNode cn = stack.pop();if (cn.color.equals("white")) {if (cn.node.right != null) {stack.push(new ColorNode(cn.node.right, "white"));}stack.push(new ColorNode(cn.node, "gray"));if (cn.node.left != null) {stack.push(new ColorNode(cn.node.left, "white"));}} else {res.add(cn.node.val);}}return res;}
}

本文标签: 收藏