笔记:二叉树构建方法
本文有点粗糙,如有错误,请批评指正
层式建树(最通用,适合层序 + 用 0 补齐所有空位以及紧凑层序(按层给节点,0 表空,但不强制补齐所有空位,每个非空节点依次给两个孩子两种情况,其中第二种情况不能使用堆式建树)
例如紧凑层序vec = [1, 0, 2, 3, 4]
正确应为
1/ \null 2/ \3 4
但是用堆式建树的话就会错误i实现实现:
下标 0 的孩子是 1、2 ⇒ 根的左=vec[1]=0(空),右=vec[2]=2 ✅
下标 1(就是那个空)按规则孩子在 3、4 ⇒ 但因为
node[1]==nullptr
,你的代码不会把node[3]
和node[4]
连上(直接continue
)下标 2 的孩子在 5、6 ⇒ 越界,不会连
于是3 和 4 成了“孤儿节点”,根本没有挂到树上。构造出的树是:
1/ \null 2
TreeNode* build_level(const vector<int>& a) {if (a.empty() || a[0] == 0) return nullptr;queue<TreeNode*> q;int i = 0;TreeNode* root = new TreeNode(a[i++]);q.push(root);while (!q.empty() && i < (int)a.size()) {TreeNode* cur = q.front(); q.pop();// 左孩子if (i < (int)a.size() && a[i] != 0) {cur->left = new TreeNode(a[i]);q.push(cur->left);}i++;// 右孩子if (i < (int)a.size() && a[i] != 0) {cur->right = new TreeNode(a[i]);q.push(cur->right);}i++;}return root;
}
堆式建树:
struct TreeNode {int val;TreeNode *left, *right;TreeNode(int v): val(v), left(nullptr), right(nullptr) {}
};TreeNode* build(const vector<int>& v) {int n = v.size();if (n == 0) return nullptr;vector<TreeNode*> nodes(n, nullptr);for (int i = 0; i < n; ++i)if (v[i] != -1) nodes[i] = new TreeNode(v[i]);for (int i = 0; i < n; ++i) {if (!nodes[i]) continue;int L = 2*i + 1, R = 2*i + 2;if (L < n) nodes[i]->left = nodes[L];if (R < n) nodes[i]->right = nodes[R];}return nodes[0];
}