排序二叉树

18 篇文章 0 订阅
18 篇文章 0 订阅

        二叉排序树又叫二叉查找树,英文名称是:Binary Sort Tree.  BST的定义就不详细说了,我用一句话概括:左 < 中 < 右。 根据这个原理,我们可以推断:BST的中序遍历必定是严格递增的

         在建立一个BST之前,大家可以做一下这个题目(很简单的):

        已知,某树的先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 请画出该树。


        我们知道,树的基本遍历有4种方式,分别是:

        先序遍历;中序遍历;后续遍历;层次遍历。事实上,知道任意两种方式,并不能唯一地确定树的结构,但是,只要知道中序遍历和另外任意一种遍历方式,就一定可以唯一地确定一棵树,于是,上面那个题目的答案如下:



      下面,我们来看看BST的建立过程,程序如下(没考虑内存泄露):

[cpp]  view plain  copy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. // BST的结点  
  5. typedef struct node  
  6. {  
  7.     int key;  
  8.     struct node *lChild, *rChild;  
  9. }Node, *BST;  
  10.   
  11. // 在给定的BST中插入结点,其数据域为element, 使之称为新的BST  
  12. bool BSTInsert(Node * &p, int element)  
  13. {  
  14.     if(NULL == p) // 空树  
  15.     {  
  16.         p = new Node;  
  17.         p->key = element;  
  18.         p->lChild = p->rChild = NULL;  
  19.         return true;  
  20.     }  
  21.   
  22.     if(element == p->key) // BST中不能有相等的值  
  23.         return false;  
  24.   
  25.     if(element < p->key)  // 递归  
  26.         return BSTInsert(p->lChild, element);  
  27.   
  28.     return BSTInsert(p->rChild, element); // 递归  
  29. }  
  30.   
  31. // 建立BST  
  32. void createBST(Node * &T, int a[], int n)  
  33. {  
  34.     T = NULL;   
  35.     int i;  
  36.     for(i = 0; i < n; i++)  
  37.     {  
  38.         BSTInsert(T, a[i]);  
  39.     }  
  40. }  
  41.   
  42. // 先序遍历  
  43. void preOrderTraverse(BST T)  
  44. {  
  45.     if(T)  
  46.     {  
  47.         cout << T->key << " ";  
  48.         preOrderTraverse(T->lChild);  
  49.         preOrderTraverse(T->rChild);  
  50.     }  
  51. }  
  52.   
  53. // 中序遍历  
  54. void inOrderTraverse(BST T)  
  55. {  
  56.     if(T)  
  57.     {  
  58.         inOrderTraverse(T->lChild);  
  59.         cout << T->key << " ";  
  60.         inOrderTraverse(T->rChild);  
  61.     }  
  62. }  
  63.   
  64. int main()  
  65. {  
  66.     int a[10] = {4, 5, 2, 1, 0, 9, 3, 7, 6, 8};  
  67.     int n = 10;  
  68.     BST T;  
  69.   
  70.     // 并非所有的a[]都能构造出BST,所以,最好对createBST的返回值进行判断  
  71.     createBST(T, a, n);  
  72.   
  73.     preOrderTraverse(T);  
  74.     cout << endl;  
  75.   
  76.     inOrderTraverse(T);  
  77.     cout << endl;  
  78.   
  79.     return 0;  
  80. }  

     那么,怎么知道我们这个程序对不对呢?我们输出其先序和中序遍历,这样就可以完全确定这棵树,运行程序,发现先序遍历为:4, 2, 1 ,0, 3, 5, 9, 7, 6, 8. 中序遍历为: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. 好了,这棵树确定了,如上图(已画)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要清空排序二叉树(Binary Search Tree,BST),可以执行以下步骤: 1. 创建一个函数,用于删除二叉树的节点。函数可以使用递归来实现。 2. 在删除函数中,首先检查当前节点是否为空。如果为空,则返回。 3. 如果当前节点不为空,递归地调用删除函数来删除左子树和右子树。 4. 释放当前节点的内存。 5. 在主程序中,调用删除函数,传入根节点来清空整个二叉树。 以下是一个示例代码,用于清空排序二叉树: ```c #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; // 创建新节点 struct Node* createNode(int data) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 删除二叉树节点 struct Node* deleteTree(struct Node* node) { if (node == NULL) { return NULL; } // 递归地删除左子树和右子树 node->left = deleteTree(node->left); node->right = deleteTree(node->right); // 释放当前节点的内存 free(node); return NULL; } int main() { struct Node* root = createNode(5); root->left = createNode(3); root->right = createNode(8); root->left->left = createNode(2); root->left->right = createNode(4); root->right->left = createNode(6); root->right->right = createNode(9); // 清空二叉树 root = deleteTree(root); if (root == NULL) { printf("二叉树已清空\n"); } else { printf("二叉树清空失败\n"); } return 0; } ``` 上述代码中,我们创建了一个简单的排序二叉树,并使用 `deleteTree` 函数来清空它。最后,我们检查根节点是否为空来验证二叉树是否已经清空。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值