每天刷個演算法題20160520:二叉排序樹
版權所有。所有權利保留。
歡迎轉載,轉載時請註明出處:
http://blog.csdn.net/xiaofei_it/article/details/51502682
為了防止思維僵化,每天刷個演算法題。已經刷了幾天了,現在發點程式碼。
我已經建了一個開源專案,每天的題目都在裡面:
https://github.com/Xiaofei-it/Algorithms
絕大部分演算法都是我自己寫的,沒有參考網上通用程式碼。讀者可能會覺得有的程式碼晦澀難懂,因為那是我自己的理解。
最近幾天都是在寫一些原來的東西,大多數是非遞迴。以後準備刷點DP、貪心之類的題。
下面是二叉排序樹:
/**
*
* Copyright 2016 Xiaofei
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package xiaofei.algorithm;
/**
* Created by Xiaofei on 16/5/20.
*/
public class BinarySearchTree {
private BinaryTreeNode root;
public BinarySearchTree() {
root = null;
}
public void insert(int data) {
if (root == null) {
root = new BinaryTreeNode();
root.data = data;
} else {
BinaryTreeNode p = root, q = null;
while (p != null) {
q = p;
if (p.data < data) {
p = p.right;
} else if (p.data > data){
p = p.left;
} else {
return;
}
}
p = new BinaryTreeNode();
p.data = data;
if (q.data < data) {
q.right = p;
} else {
q.left = p;
}
}
}
public boolean contains(int data) {
if (root == null) {
return false;
}
BinaryTreeNode p = root;
while (p != null) {
if (p.data < data) {
p = p.right;
} else if (p.data > data){
p = p.left;
} else {
return true;
}
}
return false;
}
public void delete(int data) {
if (root == null) {
return;
}
BinaryTreeNode p = root, q = null;
while (p != null) {
if (p.data < data) {
q = p;
p = p.right;
} else if (p.data > data){
q = p;
p = p.left;
} else {
break;
}
}
//element not exist
if (p == null) {
return;
}
//element is root
if (p == root) {
if (p.left == null && p.right == null) {
root = null;
} else if (p.left == null) {
root = p.right;
} else if (p.right == null) {
root = p.left;
} else {
BinaryTreeNode p1 = p.left, q1 = null;
while (p1.right != null) {
q1 = p1;
p1 = p1.right;
}
if (q1 != null) {
q1.right = p.left;
}
p1.left = p.left;
p1.right = p.right;
root = p1;
}
return;
}
if (p.left == null && p.right == null) {
if (q.data < data) {
q.right = null;
} else {
q.left = null;
}
} else if (p.left == null) {
if (q.data < data) {
q.right = p.right;
} else {
q.left = p.right;
}
} else if (p.right == null) {
if (q.data < data) {
q.right = p.left;
} else {
q.left = p.right;
}
} else {
BinaryTreeNode p1 = p.left, q1 = null;
while (p1.right != null) {
q1 = p1;
p1 = p1.right;
}
if (q1 != null) {
q1.right = p1.left;
}
p1.left = p.left;
p1.right = p.right;
if (q.data < data) {
q.right = p1;
} else {
q.left = p1;
}
}
}
public void output() {
if (root != null) {
InOrderTraversal.traversalCorecursively(root);
}
}
}
相關文章
- 每天刷個演算法題20160518:非遞迴二叉樹遍歷演算法遞迴二叉樹
- 每天刷個演算法題20160521:二叉樹高度(遞迴與非遞迴)演算法二叉樹遞迴
- 二叉排序樹(水題)排序
- 每天刷個演算法題20160525:快速排序的遞迴轉非遞迴解法演算法排序遞迴
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- #查詢演算法#【2】二叉排序樹演算法排序
- 二叉排序樹排序
- 排序二叉樹和平衡二叉樹排序二叉樹
- 二叉查詢樹(二叉排序樹)排序
- leetcode排序專題演算法刷題LeetCode排序演算法
- 二叉查詢樹【二叉排序樹】構建和查詢演算法 PHP 版排序演算法PHP
- 刷題系列 - 序列化和反序列化一個二叉樹二叉樹
- 資料結構與演算法第二天(二叉樹刷題)資料結構演算法二叉樹
- 資料結構與演算法:二叉排序樹資料結構演算法排序
- 每天刷個演算法題20160519:回溯法解八皇后演算法
- 二叉樹的應用(1)--二叉樹排序樹基本操作二叉樹排序
- js之排序二叉樹JS排序二叉樹
- 二叉排序樹 oj 2482排序
- 【筆記】二叉排序樹筆記排序
- 判斷某棵二叉樹是否二叉排序樹二叉樹排序
- leetcode 刷題視訊(5) - 二叉樹與圖LeetCode二叉樹
- js實現完全排序二叉樹、二叉搜尋樹JS排序二叉樹
- 二叉排序樹的實現排序
- 演算法題(三十五):二叉樹的下一個結點演算法二叉樹
- 刷題系列 - Python判斷是否映象對稱二叉樹Python二叉樹
- 夜刷:平衡二叉樹的基本操作二叉樹
- 演算法-二叉樹演算法二叉樹
- 刷題系列 - Python用遞迴實現求二叉樹深度Python遞迴二叉樹
- 刷題系列 - Python實現二叉樹按層級遍歷Python二叉樹
- 【LeetCode刷題(中等程度)】662. 二叉樹最大寬度LeetCode二叉樹
- 刷題系列 - 在給出二叉樹中兩個點,求出其最小共同父節點二叉樹
- 二叉排序樹BST及CRUD操作排序
- 建立一棵二叉排序樹排序
- 平衡二叉樹(AVL樹)和 二叉排序樹轉化為平衡二叉樹 及C語言實現二叉樹排序C語言
- 每天刷個演算法題20160526:BFS解決八數碼問題(九宮格問題)演算法
- JavaScript實現-LeetCode刷題-【對稱二叉樹】-第101題!!!JavaScriptLeetCode二叉樹
- 每天刷個演算法題20160522:支援各種型別的並查集演算法型別並查集
- 每天一道演算法題:求兩個排序陣列的中位數演算法排序陣列