源自B站王卓老师的数据结构课程数据结构与算法基础(青岛大学-王卓)_哔哩哔哩_bilibili
第08周03--5.5遍历二叉树和线索二叉树5--二叉树的遍历算法--中序非递归算法
课程是C语言的,我写了个Java的实现,写了个大概,没细究是否有bug,我估计是有的。
@Test
public void test() {
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.right.left = new TreeNode(4);
root.right.right = new TreeNode(5);
inOrder(root);
}
private void inOrder(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
stack.push(root);
TreeNode node = stack.pop();
while (node != null || !stack.isEmpty()){
//如果当前操作节点的左节点为空,则输出该节点
//如果不为空,则将该节点压入栈,并将左子节点压入栈
if (node != null) {
stack.push(node);
node = node.left;//指针后移,指向左节点(中旬遍历的要求),目的是为了让while循环后,
// 重新判断if语句。不断循环,直到为null为止。
} else {
//说明node为null了,那么该结点父节点就是叶子结点,输出该父结点。
node = stack.pop();
System.out.println(node.val);
node = node.right;//父结点输出完后,该输出右子结点了。
}
}
}
显然,直接写出这样的程序还是很有难度的,我觉得还是在纸上先把流程搞清楚了,然后再通过代码实现,挖个坑,改天补上。