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

55 篇文章 4 订阅
35 篇文章 1 订阅

 更多算法笔记解析,请移步小白GIS-基于地图的Web开发教程小白gis每周更新与WebGIS设计相关的文章教程,通过在线示例以及demo的方式,介绍Arcgis API、开源gis API的使用方法,帮助学习者快速入门webgis开发http://xiaobaigis.com/Home

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

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();

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

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);

测试结果:

 3 深度遍历方式

利用栈先进后出,后进先出的特点;比如先序遍历;那么先出中 左 右;那先出的需要后进栈。


 // 先序(中 左  右) 非递归
 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();
    };

测试结果与上述是一样的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨大大28

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值