二叉树的遍历(构造、前、中、后序)

输入数据格式:(完全二叉树)

arr = [1,2,3,4,5,null,6]

主函数:

var tree = function(arr){
    let root = construct(arr);  // 构造二叉树
    let ans = preorderTraversal(root);  //前序遍历-迭代法
    /**
          let ans = [];
          dfs(root,ans);   //前序遍历-递归
    **/
    return ans;
}

构造(数组转树):

var construct = function(arr, index){
    let val = arr[index-1];
    if(val == null) return null;
    return {
        val,
        left: construct(arr, index*2),
        right: construct(arr, index*2+1)
    } ;
}

前序(迭代)

var preorderTraversal = function(root) {
    let stack = new Array() //模拟栈
    let ans = new Array()   //结果数组
    let tmp;
    if(root===null){
        return ans
    }
    stack.push(root)
    while(stack.length!==0){
        tmp = stack.pop()
        ans.push(tmp.val)
        if(tmp.right!==null){
            stack.push(tmp.right)
        }
        if(tmp.left!==null){
            stack.push(tmp.left)
        }
    }
    return ans
};

中序(迭代)

var inorderTraversal = function(root) {
    let stack = new Array() //模拟栈
    let ans = new Array()   //结果数组
    let tmp;
    if(root===null){
        return ans
    }
    tmp = root;
    while(tmp!==null||stack.length!==0){    
        while(tmp!==null){
            stack.push(tmp)
            tmp = tmp.left;
        }
        tmp = stack.pop()
        ans.push(tmp.val)
        tmp = tmp.right
    }
    return ans
};

后序(迭代)

var postorderTraversal = function(root) {
    let stack = new Array() //模拟栈
    let ans = new Array()   //结果数组
    let tmp;
    if(root===null){
        return ans
    }
    tmp = root;
    stack.push(tmp);
    while(stack.length!==0){
        tmp = stack.pop()
        ans.unshift(tmp.val)
        if(tmp.left!==null){
            stack.push(tmp.left)
        }
        if(tmp.right!==null){
            stack.push(tmp.right)
        }
    }
    return ans
};

前序、中序、后序递归

// ans存储答案

//前序
var dfs = function(root,ans) {
    if(root === null) return
    ans.push(root.val)
    dfs(root.left,ans)
    dfs(root.right,ans)
}

//中序
var dfs = function(root,ans) {
    if(root === null) return
    dfs(root.left,ans)
    ans.push(root.val)
    dfs(root.right,ans)
}

//后序
var dfs = function(root,ans) {
    if(root === null) return
    dfs(root.left,ans)
    dfs(root.right,ans)
    ans.push(root.val)
}
posted @ 2020-07-20 15:21  _Sleeping  阅读(203)  评论(0)    收藏  举报