顺序存储结构,即使用数组存储,结点从下标为1的位置开始存储,a[i * 2]
和a[i * 2 + 1]
分别表示a[i]
结点的左右孩子。其中若孩子为空,则用 -1 代替。
1 2 3 4 5
| struct node { int data; node *left, *right; node(int x) : data(x) { left = right = NULL; } };
|
1 2 3 4 5 6 7
| node* create(vector<int>& a, int i) { if (i >= a.size() || a[i] == -1) return NULL; node* root = new node(a[i]); root->left = create(a, i * 2); root->right = create(a, i * 2 + 1); return root; }
|
完整代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <iostream> #include <vector> using namespace std; struct node { int data; node *left, *right; node(int x) : data(x) { left = right = NULL; } }; node* create(vector<int>& a, int i) { if (i >= a.size() || a[i] == -1) return NULL; node* root = new node(a[i]); root->left = create(a, i * 2); root->right = create(a, i * 2 + 1); return root; }
void preOrder(node* root) { if (root == NULL) return; printf("%d ", root->data); preOrder(root->left); preOrder(root->right); } int main() { vector<int> a; int temp[] = {-1, 5, 1, 4, -1, -1, 3, 6}; for (int i = 0; i < 8; i++) a.push_back(temp[i]); node* root = create(a, 1); preOrder(root); return 0; }
|