21xrx.com
2024-12-27 06:00:24 Friday
登录
文章检索 我的文章 写文章
C++实现二叉树的代码
2023-07-14 02:04:13 深夜i     --     --
C++ 二叉树 实现 代码 节点

二叉树是一种非常常见的数据结构,它能够快速的进行查找、插入和删除操作。在C++中,我们可以使用类来实现二叉树的代码,这样可以方便的存储二叉树的节点和相关信息。

在二叉树的代码实现中,我们首先需要定义二叉树的节点类。节点类存储了当前节点的值以及左右子树的指针,代码如下所示:


class TreeNode{

public:

  int val;      //当前节点的值

  TreeNode* left;   //左子树指针

  TreeNode* right;  //右子树指针

  TreeNode(int val):val(val),left(nullptr),right(nullptr){}  //构造函数

};

接下来,我们可以定义二叉树的类。在二叉树的类中,我们可以实现二叉树的插入、删除和查找操作。代码如下所示:


class BinaryTree{

public:

  TreeNode* root;   //二叉树的根节点指针

  BinaryTree():root(nullptr){}  //构造函数

  void Insert(int val){    //插入节点

    if(root==nullptr){   //如果二叉树为空

      root=new TreeNode(val); //直接将节点插入到根节点

    }else{   //如果二叉树不为空

      TreeNode* cur=root;   //从根节点开始遍历

      while(true){

        if(val<cur->val){  //如果插入的值小于当前节点的值

          if(cur->left==nullptr){   //如果左子树为空

            cur->left=new TreeNode(val);  //直接将新节点作为左子树插入

            return;

          }else   //如果左子树不为空

            cur=cur->left;   //继续向下遍历左子树

          

        }else if(val>cur->val){   //如果插入的值大于当前节点的值

          if(cur->right==nullptr){  //如果右子树为空

            cur->right=new TreeNode(val);  //直接将新节点作为右子树插入

            return;

          }else   //如果右子树不为空

            cur=cur->right;   //继续向下遍历右子树

          

        }else   //如果插入的值已经存在

          return;

        

      }

    }

  }

  bool Search(int val){    //查找节点

    TreeNode* cur=root;   //从根节点开始遍历

    while(cur!=nullptr){

      if(cur->val==val)   //如果找到了对应的节点

        return true;

      else if(val<cur->val)   //如果要查找的值小于当前节点的值

        cur=cur->left;   //向下遍历左子树

      else   //如果要查找的值大于当前节点的值

        cur=cur->right;   //向下遍历右子树

      

    }

    //如果找不到对应的节点,返回false

    return false;

  }

  void Delete(int val){    //删除节点

    //先查找节点是否存在

    if(Search(val)){

      DeleteHelper(root,val);

    }else

      std::cout<<"Node not found!"<<std::endl;

    

  }

  //删除节点的辅助函数

  TreeNode* DeleteHelper(TreeNode* cur,int val){

    if(cur==nullptr)    //如果当前节点为空

      return cur;

    else if(val<cur->val){   //如果要删除的节点在左子树中

      cur->left=DeleteHelper(cur->left,val);   //递归删除左子树中的节点

      return cur;

    }else if(val>cur->val){   //如果要删除的节点在右子树中

      cur->right=DeleteHelper(cur->right,val);  //递归删除右子树中的节点

      return cur;

    }else{   //如果找到了要删除的节点

      //如果当前节点没有左右子树

      if(cur->left==nullptr && cur->right==nullptr)

        delete cur;

        return nullptr;

      

      //如果当前节点只有左子树或右子树

      else if(cur->left==nullptr){

        TreeNode* temp=cur->right;

        delete cur;

        return temp;

      }else if(cur->right==nullptr){

        TreeNode* temp=cur->left;

        delete cur;

        return temp;

      }

      //如果当前节点左右子树均存在

      else{

        //找到右子树中的最小节点

        TreeNode* temp=cur->right;

        while(temp->left!=nullptr)

          temp=temp->left;

        

        //将当前节点的值修改为右子树中最小节点的值

        cur->val=temp->val;

        //递归删除右子树中的最小节点

        cur->right=DeleteHelper(cur->right,temp->val);

        return cur;

      }

    }

  }

};

通过以上的代码实现,我们就可以快速的实现二叉树的操作,从而方便的进行查找、插入和删除等操作。在实际的应用中,二叉树还有很多优化和扩展的操作,可以根据具体的需求进行实现。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复