二叉搜索树的特点是左子树<根节点<右子树,并且任何节点的左右子树的高度差不超过1,搜索二叉树与满二叉树无关,只要满足上面的条件即可
1.初始化操作
此时传入的为根节点的指针的指针
40 //初始化 41 void SearchTreeInit(SearchNode** pRoot) 42 { 43 if(pRoot == NULL) 44 { 45 //非法操作 46 return ; 47 } 48 *pRoot = NULL; 49 return ; 50 }
2.销毁二叉搜索树
第一种方法是传入二叉树的根节点的指针,第二种是传入二叉树的根节点的指针的指针
52 //销毁 53 void DestroySearchNode(SearchNode* node) 54 { 55 free(node); 56 } 57 //方法1 58 void SearchTreeDestroy(SearchNode* root) 59 { 60 if(root == NULL) 61 { 62 return ; 63 } 64 SearchTreeDestroy(root->lchild); 65 SearchTreeDestroy(root->rchild); 66 DestroySearchNode(root); 67 }
68 //方法2 69 void SearchTreeDestroy2(SearchNode** pRoot) 70 { 71 if(pRoot == NULL) 72 { 73 //非法操作 74 return ; 75 } 76 if(*pRoot == NULL) 77 { 78 return ; 79 } 80 SearchNode* node = *pRoot; 81 SearchTreeDestroy2(&node->lchild); 82 SearchTreeDestroy2(&node->rchild); 83 DestroySearchNode(node); 84 *pRoot = NULL; 85 return ; 86 }
3.向二叉搜索树中插入元素
若二叉树为空,则将元素直接插入到根节点的位置即可,否则就采用递归地方式,按照二叉搜索树的定义将元素插入到二叉搜索树中
98 void SearchTreeInsert(SearchNode** pRoot,SearchNodeType to_insert) 99 { 100 if(pRoot == NULL) 101 { 102 //非法操作 103 return ; 104 } 105 if(*pRoot == NULL) 106 { 107 //空树,插到root位置 108 SearchNode* new_node = CreateSearchNode(to_insert); 109 *pRoot = new_node; 110 return ; 111 } 112 //对于树非空的情况 113 //采用递归的方式进行插入 114 SearchNode* cur = *pRoot; 115 if(to_insert < cur->data) 116 { 117 //递归地往左子树中插入 118 SearchTreeInsert(&cur->lchild,to_insert); 119 } 120 else if(to_insert > cur->data) 121 { 122 //递归地往右子树中插入 123 SearchTreeInsert(&cur->rchild,to_insert); 124 } 125 else 126 { 127 //等于的情况,采用下面的约定方式 128 //约定二叉搜索树中所有的元素不能重复, 129 return ;//表示不做任何动作,插入失败 130 //也可以有其他的约定方式:将该元素放到相等元素的左子树的最右边,或者右子树的最左边 131 } 132 } 133
89 SearchNode* CreateSearchNode(SearchNodeType value) 90 { 91 SearchNode* new_node = (SearchNode*)malloc(sizeof(SearchNode)); 92 new_node->data=value; 93 new_node->lchild=NULL; 94 new_node->rchild=NULL; 95 return new_node; 96 }
4.使用递归的方法查找搜索二叉树中的元素
134 //递归的方式查找元素 135 SearchNode* SearchTreeFind(SearchNode* root,SearchNodeType to_find) 136 { 137 if(root == NULL) 138 { 139 return NULL; 140 } 141 if(to_find < root->data) 142 { 143 //递归地查找左子树 144 return SearchTreeFind(root->lchild,to_find); 145 } 146 else if(to_find > root->data) 147 { 148 //递归地查找右子树 149 return SearchTreeFind(root->rchild,to_find); 150 } 151 else 152 { 153 //相等,找到了 154 return root; 155 } 156 }