【算法笔记:二叉树遍历】递归及DFS遍历方式

已被阅读 1011 次 | 文章分类:javascript | 2022-03-10 01:02

用递归和非递归的方式实现二叉树的遍历;主要是非递归的深度遍历方式,包括先序遍历、中序遍历、后序遍历。

1 构造一个二叉树

首先用javascript实现一个简单的二叉树构造函数;其实就是一个组织结构;跟我们普通的组织树对象一样,就是个普通对象;无非二叉树更加标准,有左右孩子节点;代码如下

                                            
function TreeCode() {
    let BiTree = function(ele) {
        this.value= ele;
        this.lChild = null;
        this.rChild = null;
    }

    this.createTree = function() {
        let biTree = new BiTree('A');
        biTree.lChild = new BiTree('B');
        biTree.rChild = new BiTree('C');
        biTree.lChild.lChild = new BiTree('D');
        biTree.lChild.lChild.lChild = new BiTree('G');
        biTree.lChild.lChild.rChild = new BiTree('H');
        biTree.rChild.lChild = new BiTree('E');
        biTree.rChild.rChild = new BiTree('F');
        biTree.rChild.lChild.rChild = new BiTree('I');
        return biTree;
    }
}
                                            
                                        

调用

                                            
let myTree = new TreeCode().createTree();
                                            
                                        

这样我们就构建了一个如下图的二叉树

/net/upload/image/20220310/cd3e89b81ac1490b86cdd68444cae83f.png

2 方法一:递归

下面通过递归实现DFS深度遍历的先序遍历、中序遍历、和后序遍历

                                            
let preArray=[],middleArray=[],lastArray=[];
    //先序遍历:根、左、右
    function preOrder(root){
        if(root){
            preArray.push(root.value);
            preOrder(root.lChild);
            preOrder(root.rChild);
        }
    }
    //中序遍历:左 根 右   
    function inOrder(root){
            if(root){
                inOrder(root.lChild)
                middleArray.push(root.value);
                inOrder(root.rChild);
            }
    }
    //后序遍历:左 右 根
    function lastOrder(root){
        if(root){
            lastOrder(root.lChild);
            lastOrder(root.rChild);
            lastArray.push(root.value);
        }
    }
    preOrder(myTree);
    inOrder(myTree);
    lastOrder(myTree);
                                            
                                        

测试结果:

/net/upload/image/20220310/404f00f15e9b4f55a6117be50f97dfb3.png

3 DFS深度遍历方式

利用栈先进后出,后进先出的特点

                                            
// 先序(中 左  右) 非递归
 function preOrder(root){
        let res=[],
        stack=[root];
        while(stack.length>0){
            let node=stack.pop();
            res.push(node.value);
            if(node.rChild){
                stack.push(node.rChild);
            }
            if(node.lChild){
                stack.push(node.lChild);
            }
 
        }
        return res;
   }
   // 中序 (左 中 右) 非递归
   function middleOrder(root) {
    let res = [];
    let stack = [];
    let node = root;
    while(stack.length !== 0 || node !== null) {
        if(node !== null) {
            stack.push(node);
            node = node.lChild;
        }else {
            node = stack.pop();
            res.push(node.value);
            node = node.rChild;
        }
    }
    return res;
};
   // 后序 (左 右 中) 非递归
   // 先序 中左右=>调换右左,变成中右左,然后反转返回即可
   function lastOrder(root) {
        let res=[],
        stack=[root];
        while(stack.length>0){
            let node=stack.pop();
            res.push(node.value);
            if(node.lChild){
                stack.push(node.lChild);
            }
            if(node.rChild){
                stack.push(node.rChild);
            }
         
        }
        return res.reverse();
    };
                                            
                                        

测试结果与上述是一样的

QQ:3410192267 | 技术支持 微信:popstarqqsmall

Copyright ©2017 xiaobaigis.com . 版权所有 鲁ICP备17027716号