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

阅读更多
个人分类: JavaScript 数据结构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭