首页 > 其他分享 >二叉查找树

二叉查找树

时间:2022-11-06 10:44:30浏览次数:50  
标签:node Node right 二叉 查找 NULL root left

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef struct SortTree
  4 {
  5     int data;
  6     struct SortTree* left;
  7     struct SortTree* right;
  8 }Node;
  9 Node* root;
 10 void Init(int key)
 11 {
 12     root=(Node*)malloc(sizeof(Node));  //向系统申明指针 
 13     root->data=key;
 14     root->left=NULL;
 15     root->right=NULL;
 16 }
 17 void insert(int key) 
 18 {
 19     Node* t=root;
 20     Node* pre=NULL;
 21     while (t!=NULL)
 22     {
 23         pre=t;
 24         if (key<t->data) t=t->left;
 25         else if (key>t->data) t=t->right;
 26         else return;  //若节点已经存在 则直接返回 
 27     }
 28     if (key<pre->data)
 29     {
 30         pre->left=(Node*)malloc(sizeof(Node)),pre->left->data=key;
 31         pre->left->left=NULL,pre->left->right=NULL;
 32     }
 33     else 
 34     {
 35         pre->right=(Node*)malloc(sizeof(Node)),pre->right->data=key;
 36         pre->right->left=NULL,pre->right->right=NULL;
 37     }
 38 }
 39 bool search(Node* root,int key)  //查找是否存在节点 
 40 {
 41     while (root!=NULL)
 42     {
 43         if (key==root->data) return true;
 44         else if (key<root->data) root=root->left;
 45         else root = root->right;
 46     }
 47     return false;
 48 }
 49 int delete_node(Node* node,int key)
 50 {
 51     if (node==NULL) return  -1;
 52     else
 53     {
 54         if (node->data==key)  //若找到删除节点 
 55         {
 56             Node* temp=pre_node(root,node,key);
 57             Node* t=NULL;
 58             if (node->right=NULL)    //若其右子树为空 
 59             {
 60                 temp=node;
 61                 node=node->left;
 62                 if (temp->left->data==t->data)
 63                 {
 64                     Node* free_node=t;
 65                     temp->left=node;
 66                     free(free_node);
 67                     free_node=NULL;
 68                 }
 69                 else 
 70                 {
 71                     Node* free_node=t;
 72                     temp->right=node;
 73                     free(free_node);
 74                     free_node=NULL;
 75                 }
 76             }
 77             else if (node->left==NULL)  //若其左子树为空 
 78             {
 79                 t=node;
 80                 node=node->right;
 81                 if (temp->left->data==t->data)
 82                 {
 83                     Node* free_node=t;
 84                     temp->left=node;
 85                     free(free_node);
 86                     free_node=NULL;
 87                 }
 88                 else 
 89                 {
 90                     Node* free_node=t;
 91                     t->right=node;
 92                     free(free_node);
 93                     free_node=NULL;
 94                 }
 95             }
 96             else  //若左右子树都存在,则选择左子树最大节点为节点 保证其右子树为空 
 97             {
 98                 t=node;
 99                 Node* left_max=node->left;
100                 while (left_max->right!=NULL)
101                 {
102                     t=left_max;
103                     left_max=left_max->right;
104                 }
105                 node->data=left_max->data; //已经替换数值 所以后面不需要交换指针 
106                 if (t!=node)
107                 {
108                     t->right=left_max->left;
109                     free(left_max);
110                     left_max=NULL; 
111                 }
112                 else 
113                 {
114                     t->left=left_max->left;   //相当于放一个空 
115                     free(left_max);
116                     left_max=NULL;
117                 }
118             }
119         }
120         else if (key<node->data) delete_node(node->left,key);  //接着找到目标删除节点 
121         else if (key>node->data) delete_node(node->right,key);
122     }
123 }
124 Node* pre_node(Node* root,Node* node,int key)  //找到 节点上一个父节点 
125 {
126     if (root==NULL||node==root) return node;  //特判一下根节点情况 
127     else
128     {
129         if (root->left!=NULL&&root->left->data==key) return root;
130         else if (root->right!=NULL&&root->right->data==key) return root;
131         else if (key<root->data) return pre_node(root->left,node,key);
132         else return pre_node(root->right,node,key);
133     }
134 }
135 int main ()
136 {
137     
138 }

 

标签:node,Node,right,二叉,查找,NULL,root,left
From: https://www.cnblogs.com/zjzjzj/p/16862125.html

相关文章

  • shell-文件查找命令笔记三
    文件查找-find命令格式:find[路径][选项][操作]选项-name根据文件名查找-iname根据文件名查找,忽略大小写-perm根据文件权限查找find/etc-perm777-prun......
  • 236. 二叉树的最近公共祖先
    给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一个节点x,满足x是p、q......
  • 114. 二叉树展开为链表
    给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展......
  • 二叉树的最大宽度系列问题
    二叉树的最大宽度系列问题作者:Grey原文地址:博客园:二叉树的最大宽度系列问题CSDN:二叉树的最大宽度系列问题求树的最大宽度题目描述给你一棵二叉树的根节点root,返......
  • 105. 从前序与中序遍历序列构造二叉树
    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。示例1:  输入:pre......
  • 二叉树的遍历总结
    二叉树的遍历总结前序:https://leetcode.cn/problems/binary-tree-preorder-traversal/中序:https://leetcode.cn/problems/binary-tree-inorder-traversal/后序:https://l......
  • 用C语言查找数字个数
    【题目名称】数9的个数【题目内容】编写程序数一下1到100的所有整数中出现多少个数字9#include<stdio.h>int main(){inti=0;   intcount=0;   for(i=1;i......
  • 力扣704 二分查找
    二分查找二分查找概述:BinarySearch,也叫折半查找。折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。 二分查找原理:首先,假设表中元素......
  • 数据结构与算法之查找
    查找【知识框架】1.查找概论查找的基本概念:查找(Searching):就是根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。查找表(SearchTable......
  • 基本算法篇——二分查找
    基本算法篇——二分查找本次我们介绍基础算法中的二分查找,我们会从下面几个角度来介绍二分查找:二分查找简述二分查找模板二分查找边界例题数的范围二分查找简述首......