1.常用的二叉树的遍历方式:
(1)前序遍历:根、左、右;
(2)中序遍历:左、根、右;
(3)后续遍历:左、右、根;
因为前序遍历和后序遍历比较像,所以我们先上考察比较多的中序遍历
2.中序遍历
2.1栈方法
-
若当前节点存在,就存入栈中,并访问左子树;
-
直到当前节点不存在,就出栈放入结果数组,并通过栈顶节点访问右子树;
-
不断重复前面两步,直到当前节点不存在且栈为空
-
图画演示:
- 从1到4都存在,于是依次存入栈中,访问4的左子树,左子树不存在,将4出栈放入数组,访问4的右子树,右子树不存在,继续从栈顶取出3,访问3的右子树,3的右节点存在,所以将5入栈
- 从1到4都存在,于是依次存入栈中,访问4的左子树,左子树不存在,将4出栈放入数组,访问4的右子树,右子树不存在,继续从栈顶取出3,访问3的右子树,3的右节点存在,所以将5入栈
-
5入栈,访问其左子树,左子树不存在,即将5取出栈顶,并访问其右子树,右子树为空,即将2取出栈顶,并访问其右子树,其右子树为空,即将栈顶1取出,访问1的右子树,右子树为6,将6入栈,反复…
-
通过上面图表可知,每次查找的节点不存在时,即出栈;最后栈为空,没有下一节点的时候结束
-
代码为:
let inOrderTraversal = function(root) {
if(!root) return [];
const stack = []; //先定义一个栈
const res = []; //定义存放最后顺序结果的数组
let cur = root ; //指向树的首结点
while(cur || stack.length!=0){
//左节点依次压入栈中
while(cur){
stack.push(cur);
cur = cur.left;
}
//跳出上面的循环说明左节点为空了,那此时应该从栈顶取出元素
let node