树的深度

本文介绍了一种使用递归方法来求解树结构深度的方法。通过定义树节点结构并实现高度计算函数,可以有效地计算出任意二叉树的深度。

       在学习数据结构树结构时,遇到求解树深度的问题,附上递归法求解树深度。

typedef struct TNode *BinTree;
struct TNode{
    int Key;
    BinTree Left;
    BinTree Right;
};

int heightf(BinTree T)
{
    int left = 0, right = 0;

    if(T -> Left)
        left = heightf(T -> Left);
    if(T -> Right)
        right = heightf(T -> Right);
    if(left > right)
        return left + 1;
    else
        return right + 1;
}


### 深度优先遍历的基本实现方法 深度优先遍历(Depth-First Search, DFS)是一种用于遍历树或图的算法。它的核心思想是沿着树的深度方向尽可能深入地访问每个节点,直到无法继续深入时再回溯到上一层节点。 在 JavaScript 中,可以通过递归或者显式使用栈来实现深度优先遍历。 #### 1. 使用递归实现深度优先遍历 递归是最直观且常用的方法。其基本思路是从根节点开始,递归地访问每个子节点。 ```javascript const tree = { val: 'a', children: [ { val: 'b', children: [ { val: 'd', children: [] }, { val: 'e', children: [] } ] }, { val: 'c', children: [ { val: 'f', children: [] }, { val: 'g', children: [] } ] } ] }; const dfs = (root) => { console.log(root.val); root.children.forEach(dfs); // 递归访问子节点 }; dfs(tree); ``` 这段代码会按照深度优先的顺序输出节点值:`a`, `b`, `d`, `e`, `c`, `f`, `g`[^5]。 #### 2. 使用栈实现非递归的深度优先遍历 为了防止递归调用过深导致栈溢出,可以使用显式的栈结构模拟递归过程。 ```javascript const dfsIterative = (root) => { const stack = [root]; while (stack.length > 0) { const node = stack.pop(); console.log(node.val); // 将子节点逆序压入栈中,确保顺序正确 for (let i = node.children.length - 1; i >= 0; i--) { stack.push(node.children[i]); } } }; dfsIterative(tree); ``` 通过将子节点按逆序压入栈中,可以保证最先访问最左边的子节点,从而保持与递归方式一致的遍历顺序[^3]。 #### 3. 自定义树节点类并进行深度优先遍历 如果需要更灵活地管理树结构,可以定义一个树节点类,并结合深度优先遍历函数。 ```javascript class TreeNode { constructor(val) { this.val = val; this.children = []; } } // 构建树 const root = new TreeNode('a'); const bNode = new TreeNode('b'); const cNode = new TreeNode('c'); root.children.push(bNode, cNode); bNode.children.push(new TreeNode('d'), new TreeNode('e')); cNode.children.push(new TreeNode('f'), new TreeNode('g')); // 深度优先遍历 const traverseDFS = (node) => { console.log(node.val); node.children.forEach(traverseDFS); }; traverseDFS(root); ``` 该方法适用于需要动态构建和操作树结构的场景[^1]。 ### 总结 JavaScript 实现树的深度优先遍历主要依赖于递归和栈两种方式。递归方法简洁易懂,但需要注意调用栈的深度;迭代方法通过栈结构避免了递归的潜在问题,适用于大规模数据处理场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值