Skip to content
On this page

前后中序的迭代写法

前序遍历

要访问的元素和要处理的元素顺序是一致的,都是中间节点。

js
var preorderTraversal = function(root) {
    let stack = []  //栈
    let ans = []    //结果
    stack.push(root)	//1、根节点入栈
    while(stack!=[]){
        p = stack.pop()
        if(p==null) return ans		//终止条件!!!很重要!!
            ans.push(p.val)			//2、中节点值存入数组
        if(p.right!=null)
            stack.push(p.right)		//3、右节点入栈
        if(p.left!=null)
            stack.push(p.left)		//4、左节点入栈
    }
    return ans
};

中序遍历

中序遍历是左中右,先访问的是二叉树顶部的节点,然后一层一层向下访问,直到到达树左面的最底部,再开始处理节点(也就是在把节点的数值放进result数组中),这就造成了处理顺序和访问顺序是不一致的。

js
var inorderTraversal = function(root) {
    let stack = []  //栈:用于存放未处理的节点
    let ans = []    //结果
    let cur = root  //指针:用于定位要处理的节点
    while(cur!=null||stack.length!=0){      //注意这里的终止条件
        if(cur!=null){  
            stack.push(cur)
            cur = cur.left  //做这种取左右节点的操作时一定记得先判空!!!
        }else{      // 指针来访问节点,访问到最底层
            cur = stack.pop()
            ans.push(cur.val)
            cur = cur.right
        }
    }
    return ans
};

后序遍历

再来看后序遍历,先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中

js
var postorderTraversal = function(root) {
    const stack = []  //栈
    const ans = []    //结果
    stack.push(root)	//1、根节点入栈
    while(stack!=[]){
        p = stack.pop()
        if(p==null) break		//终止条件!!!很重要!!
            ans.push(p.val)			//2、中节点值存入数组
        if(p.left!=null)
            stack.push(p.left)		//3、左节点入栈
        if(p.right!=null)
            stack.push(p.right)		//4、右节点入栈
    }
    const reversed = ans.reverse()
    return reversed
};