PAT知识点-二叉查找树
二叉查找树
定义
1 2 3 4 5 6
| struct Node//代表树的一个结点 { int data; Node *lchild; Node *rchild; };
|
结点的创建
1 2 3 4 5 6 7 8 9
| Node *newNode(int data) { Node *node=new Node(); node->data=data; node->lchild=NULL; node->rchild=NULL; return node; }
|
查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void search(Node *root,int data) { if(root==NULL) { printf("Not Found!\n"); return; } if(data==root->data) { printf("Success!\n"); } else if(data>root->data) { search(root->rchild,data); } else { search(root->lchild,data); } }
|
插入
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| void insert(Node *&root,int data) { if(root==NULL) { root=newNode(data); return; } if(data==root->data) { return; } else if(data<root->data) { insert(root->lchild,data); } else { insert(root->rchild,data); } }
|
二叉树的建立
1 2 3 4 5 6 7 8 9
| Node *create(int a[],int n) { Node *root=NULL; for(int i=0;i<n;i++) { insert(root,a[i]); } return root; }
|
寻找树中的最大值
1 2 3 4 5 6 7 8
| Node *findMax(Node *root) { if(root->rchild!=NULL) { root=root->rchild; } return root; }
|
寻找树中的最小值
1 2 3 4 5 6 7 8
| Node *findMin(Node *root) { if(root->lchild!=NULL) { root=root->lchild; } 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 33
| void deleteNode(Node *&root,int x) { if(root==NULL) return; if(root->data==x) { 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>x) { deleteNode(root->lchild,x); } else { deleteNode(root->rchild,x); } }
|
二叉查找树的性质
对二叉查找树进行中序遍历,遍历的结果是有序的。