洛谷1305代码
#include<stdio.h>
#include<stdlib.h>
struct treenode {char val;struct treenode* left;struct treenode* right;
};
struct treenode* createnode(char val) {struct treenode* node = (struct treenode*)malloc(sizeof(struct treenode));node->val = val;node->left = NULL;node->right = NULL;return node;
}
struct treenode* buildtree(int n, char nodes[][4]) {struct treenode* root = NULL;struct treenode* nodesarray[26] = { NULL };for (int i = 0;i < n;i++) {char val = nodes[i][0];char left = nodes[i][1];char right = nodes[i][2];if (nodesarray[val - 'a'] == NULL) {nodesarray[val - 'a'] = createnode(val);}if (left != '*') {if (nodesarray[left - 'a'] == NULL) {nodesarray[left - 'a'] = createnode(left);}nodesarray[val - 'a']->right = nodesarray[right - 'a'];}if (i == 0) {root = nodesarray[val - 'a'];}}return root;
}
void preorderTraversal(struct treenode* root) {if (root == NULL) {return;}printf("%c", root->val);preorderTraversal(root->left);preorderTraversal(root->right);
}
int main() {int n;scanf("%d", & n);char nodes[n][4];for (int i = 0;i < n;i++) {scanf("%s", nodes[i]);}struct treenode* root = buildtree(n, nodes);preorderTraversal(root);printf("\n");return 0;
}
前序遍历方法(dfs)二叉树
struct MyStruct
{char l, r;
}tree[200];
void dfs(char pos)
{cout << pos;if (tree[pos].l != '*') dfs(tree[pos].l);if (tree[pos].r != '*') dfs(tree[pos].r);
}
前序遍历
void preorderTraversal(struct treenode* root) {if (root == NULL) {return;}printf("%c", root->val);preorderTraversal(root->left);preorderTraversal(root->right);
}
洛谷1160代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {int id;struct Node* prev;struct Node* next;
} Node;
Node* createNode(int id) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->id = id;newNode->prev = NULL;newNode->next = NULL;return newNode;
}
//左插
void insertLeft(Node* target, Node* newNode) {newNode->next = target;newNode->prev = target->prev;if (target->prev != NULL) {target->prev->next = newNode;}target->prev = newNode;
}
//右插
void insertRight(Node* target, Node* newNode) {newNode->prev = target;newNode->next = target->next;if (target->next != NULL) {target->next->prev = newNode;}target->next = newNode;
}
//去掉
void removeNode(Node* node) {if (node->prev != NULL) {node->prev->next = node->next;}if (node->next != NULL) {node->next->prev = node->prev;}free(node);
}
int main() {int N, M;scanf("%d", &N);Node* head = createNode(1);Node* nodes[N+1];nodes[1] = head;for (int i = 2; i <= N; i++) {int k, p;scanf("%d %d", &k, &p);Node* newNode = createNode(i);nodes[i] = newNode;if (p == 0) {insertLeft(nodes[k], newNode);} else {insertRight(nodes[k], newNode);}}scanf("%d", &M);for (int i = 0; i < M; i++) {int x;scanf("%d", &x);if (nodes[x] != NULL) {removeNode(nodes[x]);nodes[x] = NULL;}}Node* current = head;while (current->prev != NULL) {current = current->prev;}while (current != NULL) {printf("%d ", current->id);current = current->next;}return 0;
}