组别:入门组
难度:4
一棵二叉搜索树应该满足以下条件:
1.非空左子树的所有键值都小于其根节点的键值
2.非空右子树的所有键值都大于其根节点的键值
3.左右子树都是二叉搜索树
代码实现:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | /**************************************************************** * Description: 二叉搜索树 C++ implementation of Binary Search Tree(BST) * Author: Alex Li * Date: 2023-06-10 21:10:46 * LastEditTime: 2024-08-08 10:44:11 ****************************************************************/ #include <iostream> using namespace std; struct node{ int data; struct node *left,*right; }; // 创建一个新节点 struct node* newNode(int item){ struct node *temp = new node; temp->data = item; temp->left = NULL; temp->right = NULL; return temp; } // 中序遍历 void inorder(node *root){ if(root != NULL){ // 遍历左子树 inorder(root->left); // 遍历根节点 cout << root->data << "->"; // 遍历右子树 inorder(root->right); } } // 插入节点 struct node* insertNode(node *node, int data){ // 如果树为空,返回新节点 if(node == NULL) return newNode(data); // 遍历左子树并插入节点 if(data < node->data) node->left = insertNode(node->left, data); else node->right = insertNode(node->right, data); return node; } // 找到最小值节点 struct node *minValueNode(struct node *node) { struct node *current = node; // 找到最左边的叶子节点 while (current && current->left != NULL) current = current->left; return current; } // 删除节点 struct node *deleteNode(struct node *node, int data) { // 如果树为空,返回节点 if (node == NULL) return node; // 找到要删除的节点 if (data < node->data) node->left = deleteNode(node->left, data); else if (data > node->data) node->right = deleteNode(node->right, data); else { // 如果节点只有一个子节点或没有子节点 if (node->left == NULL) { struct node *temp = node->right; delete node; return temp; } else if (node->right == NULL) { struct node *temp = node->left; delete node; return temp; } // 如果节点有两个子节点 // 找到右子树的最小值节点作为中序后继节点 struct node *temp = minValueNode(node->right); // 用中序后继节点替换要删除的节点 node->data = temp->data; // 删除中序后继节点 node->right = deleteNode(node->right, temp->data); } return node; } int main(){ struct node *root = NULL; root = insertNode(root, 8); root = insertNode(root, 3); root = insertNode(root, 1); root = insertNode(root, 6); root = insertNode(root, 7); root = insertNode(root, 10); root = insertNode(root, 14); root = insertNode(root, 4); cout << "Inorder traversal: "; inorder(root); root = deleteNode(root, 10); cout << "\nAfter deleting 10\n"; inorder(root); } |
题目:判断二叉搜索树 A1527
二叉搜索树 (BST) 递归定义为具有以下属性的二叉树:
我们将二叉搜索树镜面翻转得到的树称为二叉搜索树的镜像,其中某结点大于其右侧结点,小于左则结点。中序是递减。
现在,给定一个整数序列,请你判断它是否可能是某个二叉搜索树或其镜像进行前序遍历的结果。
第一行包含整数 N,表示节点数量。
第二行包含 N个整数。
如果给定整数序列是某个二叉搜索树或其镜像的前序遍历序列,则在第一行输出 YES
,否则输出 NO
。
如果你的答案是 YES
,则还需要在第二行输出这棵树的后序遍历序列。
1≤N≤1000
7
8 6 5 7 10 9 11
YES
5 7 6 9 11 10 8
7
8 10 11 9 6 7 5
YES
11 9 10 7 5 6 8
7
8 6 7 5 10 9 11
NO