搜索二叉树的操作与实现(c Java)
·
07_二叉搜索树
二叉搜索树又叫二叉排序树,二叉查找树。
7.1 定义
在二叉树的基础上,增加了几个规则约束(左小右大):
- 如果它的左子树不空,则左子树上所有的值均小于它的根节点的值
- 若它的右子树不空,则右子树上所有的值均大于它的根节点的值
- 它的左、右树又分为二叉排序树

7.2 申明
c 实现:
typedef int Element_t;
//定义节点结构
typedef struct treenode {
Element_t data;
struct treenode* left;
struct treenode* right;
}TreeNode_t;
//定义二叉搜索树结构
typedef struct {
int count;
TreeNode_t* root;
}BinarySearchTree_t;
Java 实现:
Element:
package com.Sonnet.Element;
public class Element {
private int data;
public Element() {}
public Element(int data) {
this.data = data;
}
@Override
public String toString() {
return String.valueOf(this.data);
}
@Override
public int hashCode() {
return Integer.hashCode(this.data);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (this.getClass() != obj.getClass()) return false;
Element other = (Element)obj;
return this.data == ((Element) obj).data;
}
public int getData() {
return data;
}
}
TreeNode:
package com.Sonnet.BinarySearchTree;
import com.Sonnet.Element.Element;
public class TreeNode {
private Element data;
private TreeNode left;
private TreeNode right;
public TreeNode() {};
public TreeNode(Element data) {
this.data = data;
this.left = null;
this.right = null;
}
}
BinarySearchTree:
package com.Sonnet.BinarySearchTree;
public class BinarySearchTree {
private TreeNode root;
private int count;
}
7.3 创建
c 实现:
/*创建树*/
BinarySearchTree_t* createBinarySearchTree() {
BinarySearchTree_t* tree = malloc(sizeof(BinarySearchTree_t));
if (tree == NULL) {
printf("malloc failed\n");
return NULL;
}
//初始化
tree->count = 0;
tree->root = NULL;
return tree;
}
Java 实现:
public BinarySearchTree() {
this.root = null;
this.count = 0;
}
7.4 插入
7.4.1 递归
c 实现:
/*创建节点*/
static TreeNode_t* createTreeNode(Element_t data) {
TreeNode_t* node = malloc(sizeof(TreeNode_t));
if (node == NULL) {
printf("malloc failed\n");
return NULL;
}
//初始化
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
/*插入节点*/
static TreeNode_t* insertNode(BinarySearchTree_t* tree, TreeNode_t* node, Element_t data) {
if (node == NULL) {
tree->count++;
return createTreeNode(data);
}
if (data < node->data) {
node->left = insertNode(tree, node->left, data);
}
else if (data > node->data) {
node->right = insertNode(tree, node->right, data);
}
return node;
}
/*递归插入*/
void insertTreeNodeRecur(BinarySearchTree_t* tree, Element_t data) {
if (tree == NULL) return;
tree->root = insertNode(tree, tree->root, data);
}
Java 实现:
/*插入节点*/
private TreeNode insertNode(TreeNode node, Element data) {
if (node == null) {
this.count++;
return new TreeNode(data);
}
if (data.getData() < node.getData().getData()) {
node.setLeft(insertNode(node.getLeft(), data));
}
else if (data.getData() > node.getData().getData()) {
node.setRight(insertNode(node.getRight(), data));
}
return node;
}
/*
功能: 递归插入
参数: 节点数据
返回值: 无
*/
public void insertTreeNodeRecur(Element data) {
this.root = insertNode(this.root, data);
}
7.4.2 非递归
c 实现:
/*插入节点非递归*/
void insertTreeNodeNoRecur(BinarySearchTree_t* tree, Element_t data) {
if (tree == NULL) return;
//辅助指针
TreeNode_t* pre = NULL;
TreeNode_t* cur = tree->root;
while (cur) {
pre = cur;
if (data < cur->data) {
cur = cur->left;
}
else if (data > cur->data) {
cur = cur->right;
}
//如果相等就直接返回
else {
return;
}
}
//创建节点
TreeNode_t* node = createTreeNode(data);
if (pre) {
if (data < pre->data) {
pre->left = node;
}
else {
pre->right = node;
}
}
//当根节点不存在时,pre和cur都为空
else {
tree->root = node;
}
tree->count++;
}
Java 实现:
/*
功能:非递归插入节点
参数:节点数据
返回值:无
*/
public void insertTreeNodeNoRecur(Element data) {
//辅助指针
TreeNode pre = null;
TreeNode cur = this.root;
while (cur != null) {
pre = cur;
if (data.getData() < cur.getData().getData()) {
cur = cur.getLeft();
} else if (data.getData() > cur.getData().getData()) {
cur = cur.getRight();
//相等直接返回
} else {
return;
}
}
//创建节点
TreeNode node = new TreeNode(data);
if (pre != null) {
if (data.getData() < pre.getData().getData()) {
pre.setLeft(node);
} else {
pre.setRight(node);
}
//当根节点为空时,pre和cur都为空
} else {
this.root = node;
}
this.count++;
}
7.5 访问节点数据
c 实现:
/*访问节点数据*/
void visitTreeNode(TreeNode_t* node) {
if (node) {
printf("%d\t", node->data);
}
}
Java 实现:
public void visitTreeNode(TreeNode node) {
if (node == null) return;
System.out.print(node.getData() + "\t");
}
7.6 释放
c 实现:
/*释放节点*/
static void releaseTreeNode(BinarySearchTree_t* tree, TreeNode_t* node) {
if (node == NULL) return;
releaseTreeNode(tree, node->left);
releaseTreeNode(tree, node->right);
free(node);
tree->count--;
}
/*释放*/
void releaseBinarySearchTree(BinarySearchTree_t* tree) {
releaseTreeNode(tree, tree->root);
printf("tree have %d node\n", tree->count);
free(tree);
}
Java 实现:
/*释放节点*/
private void releaseTreeNode(TreeNode node) {
if (node == null) {
return;
}
releaseTreeNode(node.getLeft());
releaseTreeNode(node.getRight());
node.setLeft(null);
node.setRight(null);
this.count--;
}
/*
功能: 释放二叉搜索树
参数: 无
返回值: 无
*/
public void releaseBinarySearchTree() {
releaseTreeNode(this.root);
this.root = null;
System.out.println("this tree have " + this.count + " node");
}
7.7 中序遍历
c 实现:
/*中序遍历节点*/
static void inOrderTreeNode(TreeNode_t* node) {
if (node == NULL) return;
inOrderTreeNode(node->left);
visitTreeNode(node);
inOrderTreeNode(node->right);
}
/*中序遍历*/
void inOrderBinarySearchTree(BinarySearchTree_t* tree) {
inOrderTreeNode(tree->root);
printf("\n");
}
Java 实现:
/*中序遍历节点*/
private void inOrderTreeNode(TreeNode node) {
if (node == null) return;
this.inOrderTreeNode(node.getLeft());
this.visitTreeNode(node);
this.inOrderTreeNode(node.getRight());
}
/*
功能: 中序遍历
参数: 无
返回值: 无
*/
public void inOrderBinarySearchTree() {
inOrderTreeNode(this.root);
System.out.println();
}
7.8 获取高度
c 实现:
/*高度*/
int heightBinarySearchTree(TreeNode_t* node) {
if (node == NULL) return 0;
int rightHeight = heightBinarySearchTree(node->right);
int leftHeight = heightBinarySearchTree(node->left);
if (leftHeight > rightHeight) {
return ++leftHeight;
}
else {
return ++rightHeight;
}
}
Java 实现:
/*
功能: 获取二叉搜索树高度
参数: 根节点
返回值: 高度
*/
public int heightBinarySearchTree(TreeNode root) {
if (root == null) return 0;
int leftHeight = this.heightBinarySearchTree(root.getLeft());
int rightHeight = this.heightBinarySearchTree(root.getRight());
if (leftHeight > rightHeight) {
return ++leftHeight;
} else {
return ++rightHeight;
}
}
7.9 搜索
c 实现:
/*搜索*/
TreeNode_t* searchTreeNode(BinarySearchTree_t* tree, Element_t data) {
TreeNode_t* node = tree->root;
while (node) {
if (data < node->data) {
node = node->left;
}
else if (data > node->data) {
node = node->right;
}
else return node;
}
return NULL;
}
Java 实现:
/*
功能: 搜索节点
参数: 数据
返回值: 节点
*/
public TreeNode searchTreeNode(Element data) {
TreeNode node = this.root;
while (node != null) {
if (data.getData() < node.getData().getData()) {
node = node.getLeft();
} else if (data.getData() > node.getData().getData()) {
node = node.getRight();
} else {
return node;
}
}
return null;
}
e"> Java 实现:
/*
功能: 搜索节点
参数: 数据
返回值: 节点
*/
public TreeNode searchTreeNode(Element data) {
TreeNode node = this.root;
while (node != null) {
if (data.getData() < node.getData().getData()) {
node = node.getLeft();
} else if (data.getData() > node.getData().getData()) {
node = node.getRight();
} else {
return node;
}
}
return null;
}
更多推荐



所有评论(0)