lc429.N叉树的层序遍历

本文介绍了一种实现N叉树层次遍历的方法,并提供了一个具体的JavaScript代码示例。通过使用队列来跟踪节点,该算法能够有效地按层级顺序访问所有节点。
/**
 * // Definition for a Node.
 * function Node(val,children) {
 *    this.val = val;
 *    this.children = children;
 * };
 */

/**
 * @param {Node|null} root
 * @return {number[][]}
 */
var levelOrder = function(root) {
    if (root == null) { return [] }
    let queue = [], res = [], level = 0
    queue.push(root)
    while (queue.length) {
        let sz = queue.length
        res[level] = []
        for (let i = 0; i < sz; ++i) {
            let curr = queue.shift()
            res[level].push(curr.val)
            queue.push(...curr.children)
        }
        ++level
    }
    return res
};

在PTA平台上,涉及二叉树层序遍历的相关内容可参考以下信息。 ### 题目示例 PTAL3 - 010 是否完全二叉搜索树,该题与二叉树层序遍历相关,在处理时会运用到层序遍历的思想。 ### 解题方法 #### 方法一:利用位运算表示左右子节点编号建树并层序遍历 当用“x<<1”与“x<<1|1”表示左右子节点的编号建树时,顺序遍历数组就是层序遍历,不需要使用广度优先搜索(BFS)。以下是示例代码: ```cpp #include<iostream> #include<queue> #include<algorithm> #define lc (x<<1) #define rc (x<<1|1) using namespace std; const int N = 1e4; int val[N]; int n; void build(int x) { //由后序遍历建树 //依照"左右根"的顺序 if (lc <= n) build(lc);//左 if (rc <= n) build(rc);//右 cin >> val[x];//根 } void bfs(int x) { queue<int> q; q.push(x); int cnt = 0; while (q.size()) { int t = q.front(); q.pop(); cout << val[t]; cnt++; if (cnt != n) cout << ' '; //不能遍历到超出总节点个数的idx编号 if ((t * 2) <= n) q.push(t << 1); if ((t * 2 + 1) <= n) q.push(t << 1 | 1); } } int main() { cin >> n; build(1); //bfs(1); //当用x<<1 x<<1|1 表示左右子节点时 //顺序遍历数组就是层序遍历 不需要bfs int cnt = 0; for (int i = 1; i <= n; i++) { cout << val[i]; cnt++; if (cnt != n) cout << ' '; } return 0; } ``` 此代码通过位运算来表示左右子节点编号进行建树,之后顺序遍历数组实现层序遍历,无需借助队列进行BFS操作 [^1]。 #### 方法二:使用队列进行广度优先搜索(BFS)实现层序遍历 在一般情况下,可使用队列进行BFS来实现二叉树层序遍历。如上述代码中的`bfs`函数,先将根节点入队,然后不断从队列中取出节点,输出该节点的值,并将其左右子节点(若存在)入队,直到队列为空 [^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值