zoukankan      html  css  js  c++  java
  • CS 61B lab11

    测试结果:

      private BinaryTreeNode findHelper(Comparable key, BinaryTreeNode node) {
        // Replace the following line with your solution.
          BinaryTreeNode movingnode = node;
          while(movingnode!=null){
              if(key.compareTo((Comparable)(movingnode.entry.key))>0){
                  movingnode=movingnode.rightChild;
              }else if(key.compareTo((Comparable)(movingnode.entry.key))<0){
                  movingnode=movingnode.leftChild;
              }else return movingnode;
          }
        return null;
      }
    find
      public Entry remove(Object key) {
        // Replace the following line with your solution.
          if(find(key)==null) return null;
          BinaryTreeNode movingnode = root;
          int flag = 0;   //为了知道找到的node是parent的左孩子还是右孩子还是root本身
          //find the node
          while(movingnode!=null){
              if(((Comparable)key).compareTo((Comparable)(movingnode.entry.key))>0){
                  movingnode=movingnode.rightChild;
                  flag=1;
              }else if(((Comparable)key).compareTo((Comparable)(movingnode.entry.key))<0){
                  movingnode=movingnode.leftChild;
                  flag=2;
              }else{
                  BinaryTreeNode returnnode=movingnode;  //为了能返回    
                  size--;
                  if(movingnode.leftChild==null&&movingnode.rightChild==null){
                      if(flag==1){
                          movingnode.parent.rightChild=null;
                      }else if(flag==2){
                          movingnode.parent.leftChild=null;
                      }else root=null;
    //                  movingnode=null;
                  }else if(movingnode.leftChild!=null&&movingnode.rightChild!=null){
                      BinaryTreeNode targetnode=movingnode;
                      movingnode=movingnode.rightChild;
                      flag=1;
                      while(movingnode.leftChild!=null){
                          movingnode=movingnode.leftChild;
                          flag=2;
                      }
                      targetnode.entry=movingnode.entry;
                      if(flag==1){
                          movingnode.parent.rightChild=movingnode.rightChild;
                          if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
                      }else{
                          movingnode.parent.leftChild=movingnode.rightChild;
                          if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
                      }
                  }else if(movingnode.leftChild!=null){
                      if(flag==1){
                          movingnode.parent.rightChild=movingnode.leftChild;
                          if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;}
                      }else if(flag==2){
                          movingnode.parent.leftChild=movingnode.leftChild;
                          if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;}
                      }else{  //root
                          root=movingnode.leftChild;
                      }
                  }else{
                      if(flag==1){
                          movingnode.parent.rightChild=movingnode.rightChild;
                          if(movingnode.rightChild!=null){ movingnode.rightChild.parent=movingnode.parent;}
                      }else if(flag==2){
                          movingnode.parent.leftChild=movingnode.rightChild;
                          if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
                      }else{ //root
                          root=movingnode.rightChild;
                      }
                  }
                  
                  return returnnode.entry;
              }
          }
        return null;
      }
    remove

    期间发现自己一个错。。。天真的以为把node=null可以把它原本指向也变成null。。。哈哈哈写晕了

    发现可以直接利用一下findhelper,写了一个另一个版本的remove,判断node为左孩子还是右孩子的方法还可以比较key。代码短了一点点哈哈

      public Entry remove(Object key) {
          BinaryTreeNode movingnode = findHelper((Comparable)key,root);
          if(findHelper((Comparable)key,root)==null){return null;}
          size--;
          BinaryTreeNode returnnode=movingnode;
          if(movingnode.leftChild==null&&movingnode.rightChild==null){
              if(movingnode.parent==null){
                  root=null;              
              }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){
                  movingnode.parent.rightChild=null;
              }else movingnode.parent.leftChild=null;;
    //          movingnode=null;
          }else if(movingnode.leftChild!=null&&movingnode.rightChild!=null){
              BinaryTreeNode targetnode=movingnode;
              movingnode=movingnode.rightChild;
              while(movingnode.leftChild!=null){
                  movingnode=movingnode.leftChild;
              }
              if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){
                  movingnode.parent.rightChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
              }else{
                  movingnode.parent.leftChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
              }
              targetnode.entry=movingnode.entry;
          }else if(movingnode.leftChild!=null){
              if(movingnode.parent==null){
                  root=movingnode.leftChild;              
              }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){
                  movingnode.parent.leftChild=movingnode.leftChild;
                  if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;}
              }else{  //root
                  movingnode.parent.rightChild=movingnode.leftChild;
                  if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;}
              }
          }else{
              if(movingnode.parent==null){
                  root=movingnode.rightChild;              
              }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){
                  movingnode.parent.leftChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
              }else{ //root
                  movingnode.parent.rightChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){ movingnode.rightChild.parent=movingnode.parent;}
              }
          }
          return returnnode.entry;
      }
    remove edition2

    太傻了。。。我到底在想些什么,刚刚看熊孩子的判断node为左孩子还是右孩子,直接判断node==node.parent.rightChild?不就行了。。我到底在想些什么。。。。。。

      public Entry remove(Object key) {
          BinaryTreeNode movingnode = findHelper((Comparable)key,root);
          if(findHelper((Comparable)key,root)==null){return null;}
          size--;
          BinaryTreeNode returnnode=movingnode;
          if(movingnode.leftChild==null&&movingnode.rightChild==null){
              if(movingnode.parent==null){
                  root=null;              
    //      }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){
              }else if(movingnode.parent.rightChild==movingnode){  
                  movingnode.parent.rightChild=null;
              }else movingnode.parent.leftChild=null;;
    //          movingnode=null;
          }else if(movingnode.leftChild!=null&&movingnode.rightChild!=null){
              BinaryTreeNode targetnode=movingnode;
              movingnode=movingnode.rightChild;
              while(movingnode.leftChild!=null){
                  movingnode=movingnode.leftChild;
              }
    //          if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))<0){
              if(movingnode.parent.rightChild==movingnode){
                  movingnode.parent.rightChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
              }else{
                  movingnode.parent.leftChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
              }
              targetnode.entry=movingnode.entry;
          }else if(movingnode.leftChild!=null){
              if(movingnode.parent==null){
                  root=movingnode.leftChild;              
    //          }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){
              }else if(movingnode.parent.leftChild==movingnode){
                  movingnode.parent.leftChild=movingnode.leftChild;
                  if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;}
              }else{  //root
                  movingnode.parent.rightChild=movingnode.leftChild;
                  if(movingnode.leftChild!=null){movingnode.leftChild.parent=movingnode.parent;}
              }
          }else{
              if(movingnode.parent==null){
                  root=movingnode.rightChild;              
    //          }else if(((Comparable)movingnode.parent.entry.key).compareTo((Comparable)(movingnode.entry.key))>0){
              }else if(movingnode.parent.leftChild==movingnode){
                  movingnode.parent.leftChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){movingnode.rightChild.parent=movingnode.parent;}
              }else{ //root
                  movingnode.parent.rightChild=movingnode.rightChild;
                  if(movingnode.rightChild!=null){ movingnode.rightChild.parent=movingnode.parent;}
              }
          }
          return returnnode.entry;
      }
    baochiweixiao
  • 相关阅读:
    [云计算&大数据]概念辨析:数据仓库 | 数据湖 | 数据中心 | 数据中台 | 数据平台 【待续】
    [云计算]概念辨析:云计算 [IaaS/PaaS/SaaS & 公有云/私有云/混合云]
    [Linux]浅析"command > /dev/null 2>&1 &" 与 "command 1>/dev/null 2>&1 &"
    [Python]【Form Data vs Request Payload】之 python 爬虫如何实现 POST request payload 形式的请求
    [Python]PyCharm中出现unresolved reference的解决方法
    [数据库/MYSQL]MYSQL开启Bin-Log
    scrapy采集gb2312网页中文乱码笔记
    uTools 桌面软件。
    Asp.Net Core Grpc 入门实践
    ASP.NET Core 中间件(Middleware)(一)
  • 原文地址:https://www.cnblogs.com/developerchen/p/7286263.html
Copyright © 2011-2022 走看看