知识布局-数据结构-搜索二叉树
来源:互联网 发布:方舟生存进化优化太差 编辑:程序博客网 时间:2024/05/19 21:42
前言
数据结构是不可避免的。数据结构作为基础知识,在很多面试中都会涉及。所以掌握数据结构可能会给自己的面试成绩加分。今天我编写了一个搜索二叉树。
目录
1.树的节点
2.操作类型
3.树的实现
4.总结
1.树的节点
public class TreeNode { private int data; private TreeNode rightNode = null; private TreeNode leftNode = null; public int getData() { return data; } public void setData(int data) { this.data = data; } public TreeNode getLeftNode() { return leftNode; } public void setLeftNode(TreeNode leftNode) { this.leftNode = leftNode; } public TreeNode getRightNode() { return rightNode; } public void setRightNode(TreeNode rightNode) { this.rightNode = rightNode; }}
2.我们定义一个操作接口
这个操作接口就是我们二叉树支持的操作。支持插入、删除、查找。暂时不支持遍历。
/** * Created by impala on 2017/12/7. */public interface Operator { public boolean insert(int data); public TreeNode search(int data); public boolean delete(int data);}
3.树的实现
/** * Created by impala on 2017/12/7. * * @author forideal */public class BinarySearchTree implements Operator { private TreeNode rootNode = null; public BinarySearchTree() { } @Override public boolean insert(int data) { if (rootNode == null) { rootNode = new TreeNode(); rootNode.setData(data); } else { TreeNode current = rootNode; while (current != null) { if (data > current.getData()) { if (current.getRightNode() == null) { TreeNode rightChild = new TreeNode(); rightChild.setData(data); current.setRightNode(rightChild); return true; } current = current.getRightNode(); } else if (data == current.getData()) { System.out.println("The data " + data + " is exist."); return false; } else { if (current.getLeftNode() == null) { TreeNode leftChild = new TreeNode(); leftChild.setData(data); current.setLeftNode(leftChild); return true; } current = current.getLeftNode(); } } } return true; } @Override public TreeNode search(int data) { if (rootNode == null) { System.out.println("The tree is empty."); return null; } TreeNode currentNode = rootNode; while (currentNode != null) { if (data > currentNode.getData()) { currentNode = currentNode.getRightNode(); } else if (data < currentNode.getData()) { currentNode = currentNode.getLeftNode(); } else { return currentNode; } } return null; } @Override public boolean delete(int data) { if (rootNode == null) { System.out.println("The tree is empty."); return false; } //1.寻找需要删除的节点信息 TreeNode currentNode = rootNode; TreeNode parentNode = null; TreeNode targetNode = null; boolean isParentLeftChildNode = false; while (currentNode != null) { if (data > currentNode.getData()) { parentNode = currentNode; currentNode = currentNode.getRightNode(); isParentLeftChildNode = false; } else if (data < currentNode.getData()) { parentNode = currentNode; currentNode = currentNode.getLeftNode(); isParentLeftChildNode = true; } else { targetNode = currentNode; break; } } //2.目标删除节点不存在 if (targetNode == null) { System.out.println("The tree dones't has the data."); return false; } //3.目标删除节点是根节点 if (parentNode == null) { System.out.println("we will delete root node."); TreeNode tmpNode = null; TreeNode leftNode = rootNode.getLeftNode(); TreeNode curNode = rootNode.getRightNode(); while (curNode != null) { tmpNode = curNode; curNode = curNode.getLeftNode(); if (curNode == null) { tmpNode.setLeftNode(leftNode); } } rootNode = rootNode.getRightNode(); return true; } //4.目标删除节点不是跟节点 //4.1.先把target节点的左子节点拼接到右子节点上面 TreeNode leftChildNode = targetNode.getLeftNode(); TreeNode rightChildNode = targetNode.getRightNode(); TreeNode rightCur = rightChildNode; TreeNode rightParent = null; while (rightCur != null) { rightParent = rightCur; rightCur = rightCur.getLeftNode(); if (rightCur == null) { rightParent.setLeftNode(leftChildNode); } } //4.2.将刚刚拼接好的节点拼接到之前的树上 if (isParentLeftChildNode) { //如果相对于父节点来说是左子节点 TreeNode tmpNode = null; TreeNode curNode = parentNode.getRightNode(); while (curNode != null) { tmpNode = curNode; curNode = curNode.getLeftNode(); if (curNode == null) { tmpNode.setLeftNode(rightChildNode); } } parentNode.setLeftNode(null); return true; } else { //如果相对于父节点来说是右子节点 parentNode.setRightNode(rightChildNode); return true; } } public static void main(String[] args) { BinarySearchTree binarySearchTree = new BinarySearchTree(); binarySearchTree.insert(4); binarySearchTree.insert(6); binarySearchTree.insert(4); binarySearchTree.insert(3); for (int i = 10; i < 100000; i++) { binarySearchTree.insert(i); } TreeNode node = binarySearchTree.search(3); if (node == null) { System.out.println("we don't find 3."); } else { System.out.println("we find 3."); } binarySearchTree.delete(3); binarySearchTree.delete(4); binarySearchTree.delete(6); node = binarySearchTree.search(3); if (node == null) { System.out.println("we don't find 3."); } else { System.out.println("we find 3."); } node = binarySearchTree.search(4); if (node == null) { System.out.println("we don't find 4."); } else { System.out.println("we find 4."); } node = binarySearchTree.search(6); if (node == null) { System.out.println("we don't find 6."); } else { System.out.println("we find 6."); } binarySearchTree.delete(888); for (int i = 10; i < 100000; i++) { node = binarySearchTree.search(i); if (node == null) { System.out.println("we don't find " + i + "."); } } }}
4.总结
说句真心话,学习数据结构,最好能够自己动手写一个自己的实现。这样学习的效果会好一些。
阅读全文
0 0
- 知识布局-数据结构-搜索二叉树
- 数据结构知识整理(二)——二叉搜索树
- 数据结构二叉搜索树
- 数据结构-----二叉搜索树
- 数据结构:二叉搜索树
- 数据结构 ---- 二叉搜索树
- 数据结构-二叉搜索树
- 【数据结构】二叉搜索树
- 【数据结构】二叉搜索树
- 数据结构---------二叉搜索树
- 数据结构--‘搜索二叉树’
- 【数据结构】二叉搜索树
- 【数据结构】二叉搜索树
- 数据结构::搜索二叉树
- 【数据结构】二叉搜索树
- 数据结构-二叉搜索树
- 数据结构:二叉搜索树
- 数据结构 二叉搜索树
- 服务化了,没想到耦合更加严重?
- selenium+python:脚本学习笔记(二)
- 网站性能测试基本指标
- Git Subtree 的介绍及使用
- Nepire的校OJ入门题解—蓝桥选拔篇(三)
- 知识布局-数据结构-搜索二叉树
- 安卓集成eclipse 中的 The import android.support.v7.app cannot be resolved 问题解决方法
- phpcms 专题中添加字段
- 关于STL中vector容器的一些总结
- RGB图像区域直方图统计方法
- VS2017 Web项目添加引用项目后,引用上有黄色的感叹号小图标
- POJ 3468-A Simple Problem with Integers
- 11、新手入手树莓派教程--Qt中使用wiringPi来驱动RGB灯、使用opencv打开摄像头
- Lintcode:插入区间