JS 二叉树的三种遍历(递归)方式

所谓二叉树的遍历,是指按照一定的顺序对二叉树的每一个节点均访问一次,且只访问一次。

按照访问根节点的访问位置不同通常把二叉树的遍历分为三种方式:

前序遍历、中序遍历、后序遍历

手画的图。。有点丑见谅

一、前序遍历

首先访问根节点,然后访问根节点的左子树,在访问根节点的右子树。

遍历结果:abdefgc

 

function DLR(tree){
    console.log(tree.value);
    if(tree.left){
        DLR(tree.left);
    }
    if(tree.right){
        DLR(tree.right);
    }
}

 

二、中序遍历

 

首先访问根节点的左子树,然后访问根节点,再访问根节点右子树

遍历结果: debgfac

 

function LDR(tree){
    if(tree.left){
        LDR(tree.left);
    }
    console.log(tree.value);
    if(tree.right){
        LDR(tree.right);
    }
}

 

三、后序遍历

 

首先访问根节点的左子树,然后访问根节点的右子树,最后访问根节点

遍历结果:edgfbca

 

function LRD(tree){
    if(tree.left){
        LRD(tree.left);
    }
    if(tree.right){
        LRD(tree.right);
    }
    console.log(tree.value);
}

 

下面来看一个实例:

 

var tree = {
		    "id": 0,
		    "name": "root",
		    "left": {
		        "id": 1,
		        "name": "Simon",
		        "left": {
		            "id": 3,
		            "name": "Carl",
		            "left": {
		                "id": 7,
		                "name": "Lee",
		                "left": {
		                    "id": 11,
		                    "name": "Fate"
		                }
		            },
		            "right": {
		                "id": 8,
		                "name": "Annie",
		                "left": {
		                    "id": 12,
		                    "name": "Saber"
		                }
		            }
		        },
		        "right": {
		            "id": 4,
		            "name": "Tony",
		            "left": {
		                "id": 9,
		                "name": "Candy"
		            }
		        }
		    },
		    "right": {
		        "id": 2,
		        "name": "right",
		        "left": {
		            "id": 5,
		            "name": "Carl",
		        },
		        "right": {
		            "id": 6,
		            "name": "Carl",
		            "right": {
		                "id": 10,
		                "name": "Kai"
		            }        
		        }
		    }
		}
		
         // 把这个对象中所有的名字以“前序遍历”的方式全部输出到console中
         function getListWithDLR(obj) {
            console.log(obj.id);
            if(obj.left){
                getListWithDLR(obj.left);
            }
            if(obj.right){
                getListWithDLR(obj.right);
            }
        }
        console.log("前序遍历:");
        getListWithDLR(tree);

        // 把这个对象中所有的名字以“中序遍历”的方式全部输出到console中
        function getListWithLDR(obj) {
                if(obj.left){
                    getListWithLDR(obj.left);
                }
                console.log(obj.id);
                if(obj.right){
                    getListWithLDR(obj.right);
                }         
        }
        console.log("中序遍历:");
        getListWithLDR(tree);

        // 把这个对象中所有的名字以“后序遍历”的方式全部输出到console中
        function getListWithLRD(obj) {
                if(obj.left){
                    getListWithLRD(obj.left);
                }
                if(obj.right){
                    getListWithLRD(obj.right);
                } 
                console.log(obj.id);
        }
        console.log("后序遍历:");
        getListWithLRD(tree);

三种遍历的操作其实大致相同,而起差异就在于执行额外操作的时机,例如console.log

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

衣乌安、

嘿嘿,好心人赏俩钱儿~

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

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

打赏作者

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

抵扣说明:

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

余额充值