• 二叉排序树的实现(部分)


    二叉排序树的实现

    1.编写SearchBST(T, key)与InsertBST(T, key)的伪代码

    1. SearchBST伪代码

      void SearchBST(T,key){
      	if(T为空||T==key) return T;
      	if(T>key)
      		SearchBST(T->lchild,key);
      	else 
      		SearchBST(T->rchild,key);
      }
      
    2. InsertBST伪代码

      void InsertBST(T,key){
      	if(T为空){
      		T=new Node;
      		T=key;
      		T->lchild=NULL;
      		T->rchild=NULL;
      		return true;
      	}else if(T==key) return false;
      	else if(T>key) 
      		InsertBST(T->lchild,key);
      	else
      		InsertBST(T->rchild,key);
      }
      

    2.编写CreateBST(T)的伪代码实现从控制台输入创建BST树。最后使用代码实现。使用“50 30 80 20 40 90 10 25 35 85 23 88”创建BST,并中序输出该BST

    1. CreateBST伪代码

      BSTree CreateBST(T){
      	T=new Node;
      	T->lchild=NULL;
      	T->rchild=NULL;
      	//输入key
      	if(T不空) T=key;
      	while(key!=0){
      		//输入key
      		if(T不空){
      			InsertBST(T,key);
      		}
      	}
              return T;
      }
      
    2. 创建BST树:

      1. 数据类型定义:

        typedef struct BSTNode {
        	int data;
        	struct BSTNode* lchild, * rchild;
        }*BSTree;
        
      2. SearchBST函数:

        BSTree SearchBST(BSTree T, int key) {
        	if (T == NULL || T->data == key) return T;
        	if (T->data > key)
        		return SearchBST(T->lchild, key);
        	else
        		return SearchBST(T->rchild, key);
        }
        
      3. InsertBST函数:

        bool InsertBST(BSTree T, int key) {
        	if (T == NULL){
        		T = new BSTNode;
        		T->data = key;
        		T->lchild = NULL;
        		T->rchild = NULL;
        		return true;
        		}
        	else if (T->data == key) return false;
        	else if (T->data > key)
        		return InsertBST(T->lchild, key);
        	else
        		return InsertBST(T->rchild, key);
        }
        
      4. CreateBST函数:

        BSTree CreateBST(BSTree T) {
        	T = new BSTNode;
        	T->lchild = NULL;
        	T->rchild = NULL;
        	int key;
        	cin >> key;
        	if (T != NULL) T->data = key;
        	while (key != 0) {
        		cin >> key;
        		if (T != NULL) {
        			InsertBST(T, key);
        		}
        	}
                return T;
        }
        
      5. 中序遍历:

        void InOrder(BSTree T) {
        	if (T != NULL) {
        		InOrder(T->lchild);
        		cout << T->data<<" ";
        		InOrder(T->rchild);
        	}
        }
        
      6. main函数:

        void main()
        {
        	BSTree T;
        	T = new BSTNode;
        	int key;
        	CreateBST(T);
        	cout << "中序遍历结果为:" << endl;
        	InOrder(T);
        	cin >> key;
        	SearchBST(T, key);
        	InsertBST(T, key);
        	InOrder(T);
        }
        
      7. 代码运行截图:

    3.编写DeleteBST(T, key)的伪代码实现从T中删除关键字key。

    注意事项及要点:

    删除关键字key首先要判断key所在结点的位置:①叶子结点②仅有左或右子树结点③左右子树都有的结点

    ①叶子结点:找到key后直接删除即可;

    ②仅有左或右子树结点:将T的双亲节点的rchild/lchild指向T的rchild/lchild,即将左右子树结点上移即可;

    ③左右子树都有的结点:方法一:以其前驱替代T结点,然后再删除该前驱结点。前驱是左子树中最大的结点。方法二:用其后继结点替代T结点,然后删除该后继结点。后继是右子树中最小结点。

    DeleteBST伪代码:

    void DeleteBST(T,key){
    	if(T为空) return 0;
    	else{
    		if(T>key)
    			DeleteBST(T->lchild,key);
    		else if(T<key)
    			DeleteBST(T->rchild,key);
    		else{
    			DeleteBST(T);
    			return 1;
    		}
    	}
    }
    
  • 相关阅读:
    第十天冲刺个人博客
    第九天冲刺个人博客
    软件工程学习进度表(十六周)
    部署一个件简简单单的项目竟然会遇到这么多事?
    Apache和Tomcat公用80端口
    windows下nginx中配置端口转发 ----本文来自转载
    linux中nginx中配置端口转发
    字体图标:Font Awesome
    最新主流 Markdown 编辑器推荐
    博客园如何转载别人的文章(来自转载)
  • 原文地址:https://www.cnblogs.com/hcy420/p/12728725.html
Copyright © 2020-2023  润新知