PAT (Advanced Level) Practice 二叉查找樹 相關題node
struct Node{ typename data; int level; int lchild; int rchild; } node[MAXN];
int index = 0; int newNode (int value){ // node[index] = {value,-1,-1}; node[index].data = value; node->lchild = node->rchild = -1; return index++; }
void insert (int &root, int value){ if (root == -1){ root = newNode(value); return; } if (root->data == value) return; else if (root->data > value) insert(root->lchild, value); else insert(root->rchild, value); }
int create (int value[], int n){ int root = -1; for (int i = 0; i < n; i++) insert(root, value[i]); return root; }
void search (int root, int value, int newvalue){ if (root == -1) return; if (root->data == value) root->data = newvalue; else if (root->data > value) search(root->lchild, value, newvalue); else search(root->rchild, value, newvalue); }
int findMax (int root){ while (root->rchild != -1) root = root->rchild; return root; } int findMin (int root){ while (root->lchild != -1) root = root->lchild; return root; } void deleteNode (int &root, int value){ if (root == -1) return; if (root->data == value){ if (root->lchild == -1 && root->rchild == -1) root = -1; else if (root->lchild != -1){ int pre = findMax(root->lchild); root->data = pre->data; deleteNode(root->lchild, pre->data); } else{ int next = findMin(root->rchild); root->data = next->data; deleteNode(root->rchild, next->data); } } else if (root->data > value) deleteNode(root->lchild, value); else deleteNode(root->rchild, value); }
vector<pair<int,int>>
儲存結點對應左右子結點便可#include<iostream> #include<vector> #include<queue> #include<algorithm> using namespace std; vector<pair<int,int>> tree; vector<int> in, level, data, match; void inorder(int root){ if (root == -1) return; inorder(tree[root].first); in.push_back(root); inorder(tree[root].second); } void levelorder(int root){ queue<int> q; q.push(root); while (!q.empty()){ int now = q.front(); level.push_back(match[now]); q.pop(); if (tree[now].first != -1) q.push(tree[now].first); if (tree[now].second != -1) q.push(tree[now].second); } } int main() { int n; scanf("%d", &n); tree.resize(n); for (int i = 0; i < n; i++) scanf("%d%d", &tree[i].first, &tree[i].second); data.resize(n); for (int i = 0; i < n; i++) scanf("%d", &data[i]); sort(data.begin(), data.end()); inorder(0); match.resize(n); for (int i = 0; i < n; i++) match[in[i]] = data[i]; levelorder(0); for (int i = 0; i < n; i++) printf("%d%c", level[i], i+1 == n ? '\n' : ' '); return 0; }
#include<iostream> using namespace std; struct Node{ int data, lchild, rchild; } node[1000]; int index = 0, depth = -1, levelnum[1000] = {0}; void insert(int &root, int value){ if (root == -1){ node[index] = {value, -1, -1}; root = index++; } else if (node[root].data >= value) insert(node[root].lchild, value); else insert(node[root].rchild, value); } void DFS(int root, int level){ levelnum[level]++; if (level > depth) depth = level; if (node[root].lchild != -1) DFS(node[root].lchild, level+1); if (node[root].rchild != -1) DFS(node[root].rchild, level+1); } int main() { int n, data, root = -1; scanf("%d", &n); for (int i = 0; i < n; i++){ scanf("%d", &data); insert(root, data); } DFS(0,0); printf("%d + %d = %d\n", levelnum[depth], levelnum[depth-1], levelnum[depth]+levelnum[depth-1]); return 0; }
#include<iostream> #include<vector> #include<unordered_map> using namespace std; int main() { int m, n, u, v, root; scanf("%d%d", &m, &n); vector<int> pre(n); unordered_map<int,bool> keys; for (int i = 0; i < n; i++){ scanf("%d", &pre[i]); keys[pre[i]] = true; } for (int i = 0; i < m; i++){ scanf("%d%d", &u, &v); if (!keys[u] && !keys[v]) printf("ERROR: %d and %d are not found.\n", u, v); else if (!keys[u]) printf("ERROR: %d is not found.\n", u); else if (!keys[v]) printf("ERROR: %d is not found.\n", v); else{ for (root = 0; root < n; root++) if ((pre[root] >= u && pre[root] <= v) || (pre[root] <= u && pre[root] >= v)) break; if (pre[root] == u || pre[root] == v) printf("%d is an ancestor of %d.\n", pre[root]==u?u:v, pre[root]==u?v:u); else printf("LCA of %d and %d is %d.\n", u, v, pre[root]); } } return 0; }
struct Node{ typename data; int level Node* lchild; Node* rchild; }
Node* newNode (int value){ Node* node = new Node; node->data = value; node->lchild = node->rchild = NULL; return node; }
void insert (Node* &root, int value){ if (root == NULL){ root = newNode(value); return; } if (root->data == value) return; else if (root->data > value) insert(root->lchild, value); else insert(root->rchild, value); }
Node* create (int value[], int n){ node* root = NULL; for (int i = 0; i < n; i++) insert(root, value[i]); return root; }
void search (Node* root, int value, int newvalue){ if (root == NULL) return; if (root->data == value) root->data = newvalue; else if (root->data > value) search(root->lchild, value, newvalue); else search(root->rchild, value, newvalue); }
Node* findMax (Node* root){ while (root->rchild != NULL) root = root->rchild; return root; } Node* findMin (Node* root){ while (root->lchild != NULL) root = root->lchild; return root; } void deleteNode (Node* root, int value){ if (root == NULL) return; if (root->data == value){ if (root->lchild == NULL && root->rchild == NULL) root = NULL; else if (root->lchild != NULL){ Node* pre = findMax(root->lchild); root->data = pre->data; deleteNode(root->lchild, pre->data); } else{ Node* next = findMin(root->rchild); root->data = next->data; deleteNode(root->rchild, next->data); } } else if (root->data > value) deleteNode(root->lchild, value); else deleteNode(root->rchild, value); }