树的深度和宽度

收集树中的节点,放在一个map中去。key是高度,个数是宽度。

使用前序遍历,初始树的高度为1,当节点不空时高度加一,当节点空减一,把叶结点遍历完后减一。

二叉树

function createNode(data) {
    return {
        data: data||null,
        left: null,
        right:null
    }
}

var tree = {
    data: 1,
    left: {
        data: 2,
        left: {
        	data:3
        },
        right:{
        	data:5,
        	left: {
	        	data:8
	        }
        }
    },
    right: {
        data: 4,
        left: {
            data: 5
        },
        right: {
            data: 15
        }
    }
};
var height=0;
var map={};
rec(tree);

function rec(node) {
    if (node) {
        if(!map[height]){
        	map[height]=[];
        }
        map[height].push(node);
    }else{
    	height--;
    	return;
    }
    if (node.left) {
    	height++
    	rec(node.left);
    }
    if (node.right) {
    	height++
    	rec(node.right);
    }
    height--;
}

多个子元素

function createNode(data) {
    return {
        data: data||null,
        left: null,
        right:null
    }
}

var tree = {
    data: 1,
    child:[
        {
            data:2,
            child:[
                {
                    data:3,
                    child:[]
                },
                {
                    data:4,
                    child:[
                        {
                            data:6,
                            child:[]
                        }
                    ]
            }]
        }
    ]
};
var height=0;
var map={};
rec(tree);

function rec(node) {
    if (node) {
        if(!map[height]){
        	map[height]=[];
        }
        map[height].push(node);
    }else{
    	height--;
    	return;
    }
    if (node.child && node.child.length) {
        
        for (var i = 0; i < node.child.length;i++){
            height++
            rec(node.child[i]);
        }
    }
    height--;
}


### 概念 - **深度优先搜索树**:深度优先搜索是一种用于遍历或搜索树或图的算法。在搜索过程中,沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。深度优先搜索树就是基于深度优先搜索算法构建出的树结构。 - **宽度优先搜索树**:宽度优先搜索也是一种用于遍历或搜索树或图的算法。它从根节点开始,沿着树的宽度遍历树的节点。即逐层地访问节点,先访问完当前层的所有节点后,再进入下一层继续访问。宽度优先搜索树是基于宽度优先搜索算法构建出的树结构。 ### 特点 - **深度优先搜索树**: - 搜索路径深入树的分支,可能会在某一分支上深入到很远才回溯。 - 空间复杂度通常为树的深度,因为在递归调用时需要保存调用栈,栈的深度最大为树的深度。 - 可能会陷入深度很大的分支,导致搜索时间较长,尤其是在树的深度很大而目标节点在较浅层次时。 - **宽度优先搜索树**: - 逐层扩展节点,能够保证找到的路径是最短路径(在无权图中)。 - 空间复杂度通常较高,因为需要保存当前层的所有节点,空间复杂度为树的最宽层节点数。 - 搜索过程比较平稳,不会像深度优先搜索那样在某一分支上深入过远。 ### 应用 - **深度优先搜索树**: - **迷宫求解**:可以沿着一条路径一直走下去,直到走不通再回溯,尝试其他路径。 - **拓扑排序**:在有向无环图中,深度优先搜索可以用于进行拓扑排序。 - **连通分量求解**:在图中找出所有的连通分量。 - **宽度优先搜索树**: - **最短路径问题**:在无权图中,宽度优先搜索可以找到从起点到终点的最短路径。 - **社交网络分析**:例如查找两个人之间的最短关系链。 - **游戏中的路径规划**:如在一些策略游戏中,寻找角色从当前位置到目标位置的最短移动路径。 ### 代码示例 以下是使用Python实现的深度优先搜索宽度优先搜索遍历二叉树的代码: ```python # 定义二叉树节点类 class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right # 深度优先搜索遍历二叉树 def dfs(root): if root is None: return print(root.val) dfs(root.left) dfs(root.right) # 宽度优先搜索遍历二叉树 from collections import deque def bfs(root): if root is None: return queue = deque([root]) while queue: node = queue.popleft() print(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) # 示例使用 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) print("深度优先搜索遍历结果:") dfs(root) print("宽度优先搜索遍历结果:") bfs(root) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值