- 浏览: 116962 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
jiasuo110:
就是,我也找不到!
jquery easyui datagrid:使columns的field支持点连接的字符串属性 -
Arthuroo:
大哥,您好,为什么我在源码中找不到cc.push(_4ea[_ ...
jquery easyui datagrid:使columns的field支持点连接的字符串属性
import java.util.ArrayList; import java.util.List; //author:lilywangcn class Node { public Node left = null; public Node right = null; public int key; public Node(int key) { this.key = key; } } public class BinaryTree { public Node root; public BinaryTree() { root = null; } public Node search(int key, Node current) { //查找节点 if (current == null) return null; if (current.key == key) return current; else if (key < current.key) { return search(key, current.left); } else { return search(key, current.right); } } public void insert(int key) { //插入节点 if (root == null) { root = new Node(key); return; } Node current = root; Node parent = root; boolean isLeftChild = true; while (current != null) { parent = current; if (key < current.key) { current = current.left; isLeftChild = true; } else { current = current.right; isLeftChild = false; } } if (isLeftChild) { parent.left = new Node(key); } else { parent.right = new Node(key); } } public void preorder(Node current) { //先序遍历 if (current == null) return; preorder(current.left); System.out.print(current.key + " "); preorder(current.right); } public void inorder(Node current) { //中序遍历 if (current == null) return; System.out.print(current.key + " "); inorder(current.left); inorder(current.right); } public void delete(int key) { //删除节点 if (root == null) return; Node parent = root; Node delNode = parent; boolean isLeft = true; while (delNode!=null && delNode.key != key ) { parent = delNode; if (key < delNode.key) { delNode = delNode.left; isLeft = true; } else { delNode = delNode.right; isLeft = false; } } //查找到删除的节点以及其父节点,弄清楚被删除节点在父节点的左节点还是右节点 if(delNode==null) { System.out.println("delnode not exists, eixt!"); return; } if (delNode.left == null && delNode.right == null) { //如果删除节点是叶子节点 if (delNode == root) root = null; else if (isLeft) { parent.left = null; } else parent.right = null; return; } if (delNode.right == null) { //如果删除节点只有一个子节点,使用这个节点的子节点替换删除节点 if (delNode == root) root = root.left; else if (isLeft) { parent.left = delNode.left; } else { parent.right = delNode.left; } return; } if (delNode.left == null) { if (delNode == root) root = root.right; else if (isLeft) { parent.left = delNode.right; } else { parent.right = delNode.right; } return; } Node parentSuccessor = delNode.right; //如果删除节点有两个子节点,找到它的后继节点替换它 Node successor = delNode.right; while (successor.left != null) { parentSuccessor = successor; successor = successor.left; } if (successor == delNode.right) { //后继节点是删除节点的右子节点,机后继节点没有左子树 successor.left = delNode.left; if (delNode == root) { root = successor; return; } else if (isLeft) { parent.left = successor; } else { parent.right = successor; } } else { parentSuccessor.left = successor.right; //后继节点是删除节点右子节点的左子树上的最左边节点 successor.left = delNode.left; successor.right = delNode.right; if (delNode == root) { root = successor; } else if (isLeft) { parent.left = successor; } else { parent.right = successor; } } }
public void printlevel(Node node, int n){ //打印层数为n的节点 if(node==null) return; if(n==1) System.out.print(node.key+" "); printlevel(node.left,n-1); printlevel(node.right,n-1); }
private int depth(Node node, int n){ //获取树的深度=max(左子树的深度,右子树的深度)+1 if(node==null) return n; int left=depth(node.left,n+1); int right=depth(node.right,n+1); return left>right?left:right; }
public void printtree(){ List<Node> arrayList=new ArrayList<Node>(); List pos=new ArrayList(); int cur=0; int last=0; pos.add(cur); Node current=root; arrayList.add(current); while(last >= cur){ int end=last; while(cur<=end){ current=arrayList.get(cur); System.out.print(current.key+ " "); if(current.left!=null) { arrayList.add(current.left); last++; } if(current.right!=null){ arrayList.add(current.right); last++; } cur++; } System.out.println(""); pos.add(cur); } System.out.println("reverse:"); //逆序层层遍历树,层节点逆序 int j=pos.size()-2; for(int i=arrayList.size()-1; i>=0; i--){ System.out.print(arrayList.get(i).key+" "); if(i == (Integer)pos.get(j)) { j--; System.out.println(""); } } System.out.println("reverse2:"); j=pos.size()-2; for(int i=(Integer)pos.get(j); i<(Integer)pos.get(j+1);){ //逆序层层遍历树,层节点顺序 System.out.print(arrayList.get(i).key+" "); i++; if(i == (Integer)pos.get(j+1)) { j--; System.out.println(""); if(j<0) break; i=(Integer)pos.get(j); } } } public static void main(String[] args) { System.out.println("build the tree"); BinaryTree bt = new BinaryTree(); bt.preorder(bt.root); bt.insert(50); bt.insert(25); bt.insert(75); bt.insert(12); bt.insert(37); bt.insert(43); bt.insert(30); bt.insert(33); bt.insert(87); bt.insert(93); bt.insert(97); System.out.println("preorder the tree"); bt.preorder(bt.root); System.out.println("\ninorder the tree"); bt.inorder(bt.root); System.out.println("\nsearch the tree"); if (bt.search(93, bt.root) != null) { System.out.println("find!"); } else { System.out.println("not find!"); } System.out.println("before delete the node"); int depth=bt.depth(bt.root, 0); for(int i=1;i<=depth;i++){ bt.printlevel(bt.root,i); System.out.println(""); } bt.delete(50); System.out.println("after delete the node"); for(int i=1;i<=depth;i++){ bt.printlevel(bt.root,i); System.out.println(""); } bt.printtree(); } }
运行结果:
build the tree preorder the tree 12 25 30 33 37 43 50 75 87 93 97 inorder the tree 50 25 12 37 30 33 43 75 87 93 97 search the tree find! before delete the node 50 25 75 12 37 87 30 43 93 33 97 after delete the node 75 25 87 12 37 93 30 43 97 33 print the tree 75 25 87 12 37 93 30 43 97 33 reverse: 33 97 43 30 93 37 12 87 25 75 reverse2: 33 30 43 97 12 37 93 25 87 75
发表评论
-
棋盘覆盖问题
2011-05-26 11:42 1450算法分析,以4*4的方格为例,特殊方格只 ... -
趣味算法(一)Josephus问题
2011-05-10 17:48 2387Josephus问题求解: 设有n个人围坐一个圆桌周 ... -
数组中前k大的数
2011-05-09 16:04 3240问题:《编程之美》page ... -
数组中第k大的数
2011-05-09 15:39 1572方法:有两种。参见:http://hi.baidu.com/m ... -
分治算法(二)--》数组中的第二小值
2011-05-09 14:23 1845问题:《编程之美》,p ... -
分治算法(一)--》数组中的最小值最大值
2011-05-09 14:19 1314问题:《编程之美》page166. 寻找数组中的最大值,最小值 ... -
排序系列(八)--选择排序
2011-05-09 13:57 723public class SelectSort { ... -
排序系列(七)--基数排序
2011-04-12 18:23 792import java.util.ArrayList; ... -
排序系列(六)--堆排序
2011-04-12 18:22 958//author:lilywangcn public ... -
排序系列(五)---归并排序
2011-04-12 18:20 899//author:lilywangcn public ... -
排序系列(四)---希尔排序
2011-04-12 18:18 1239//author:lilywangcn pub ... -
排序系列(三)---插入排序
2011-04-12 18:15 699//lilywangcn public class I ... -
排序系列(二)--快速排序
2011-04-12 18:13 1120//author:lilywangcn public ... -
排序系列(一)---冒泡排序
2011-04-12 18:10 1099//author:lilywangcn public ... -
5元10元找钱问题
2010-12-14 11:19 1342问题:有10个人去买票,票价5元,其中5个人有5元的钱,另外5 ...
相关推荐
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...
在C++编程中,二叉查找树(Binary Search Tree,简称BST)是一种常见的数据结构,它具有以下特性:对于任意节点,其左子树中的所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。这种性质使得...
`main.cpp`文件是程序的入口,它会创建二叉查找树实例,然后可能进行一系列插入、查找和删除操作,并打印出结果。例如: ```cpp #include "Binary_tree.h" // 或 "Search_tree.h" int main() { BinarySearchTree ...
### 一种高效二叉查找树——红黑树 #### 一、引言 在计算机科学领域,二叉查找树(Binary Search Tree, BST)是一种非常重要的数据结构,它能够有效地实现查找、插入和删除等基本操作。然而,在某些情况下,普通的...
主函数首先初始化根节点为`NULL`,然后读取用户输入的一系列整数并依次插入二叉查找树中。最后,输出三种遍历方式的结果。 ### 三、总结 通过上述代码解析,我们了解了二叉查找树的基本概念、插入及遍历操作的具体...
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上所有节点的值都大于该节点的值。这个特性使得二叉...
最优二叉搜索树,也称为最优化二叉查找树或者动态二叉搜索树,是计算机科学中的一个重要概念,尤其在算法设计与分析领域占据一席之地。这种数据结构主要用于提高查询效率,在某些特定操作序列下,它能比普通二叉搜索...
本实验专注于二叉查找树(Binary Search Tree, BST)以及它的平衡版本——AVL树。这两种数据结构在处理大量数据时,尤其是进行查找、插入和删除操作时,具有较高的效率。 首先,二叉查找树是一种特殊的二叉树,其中...
本实验主要探讨了两种经典的数据结构:红黑树(Red-Black Tree)和二叉查找树(Binary Search Tree,BST),这些都是科大算法实验2的重点内容。 二叉查找树是一种特殊的二叉树,其每个节点都包含一个键、一个关联值...
二叉查找树的一系列操作
在描述中提到,我们需要以回车('\n')为输入结束标志,输入一系列数字来构建二叉排序树。这个过程可以通过以下步骤实现: 1. 初始化一个空的根节点。 2. 循环读取用户输入的数字,直到遇到回车。 3. 对每个输入的...
二叉排序树(Binary Search Tree, BST),又称二叉查找树或有序二叉树,是一种特殊的二叉树,其特点在于对于任意节点而言,其左子树中的所有节点的值均小于该节点的值,而右子树中的所有节点的值均大于该节点的值。...
在本篇文章中,我们将深入探讨如何利用二叉链表和顺序表两种不同的数据结构来构建二叉排序树(Binary Search Tree, BST),并通过具体示例来演示其创建、遍历以及查找性能分析的过程。 #### 二叉链表构建二叉排序树...
用户输入一系列数字(以0作为终止标识),程序逐个插入节点,构建二叉排序树。 2. **插入节点**:`Bstree Insert(Bstree tree, int key)`函数负责在已有的二叉排序树中插入新节点。当遇到已存在的键值时,不会插入...
4. **二叉排序树**:也称为二叉查找树,是一种二叉树结构,其中每个节点的左子树只包含比它小的节点,右子树只包含比它大的节点。这种特性使得二叉排序树非常适合进行查找、插入和删除操作,且时间复杂度可以达到O...
首先,二叉查找树由一系列节点组成,每个节点包含三个要素:数据域、左子节点引用和右子节点引用。数据域存储该节点存储的值,左、右子节点引用则指向该节点的左右子树。在JavaScript中,我们可以使用构造函数来定义...
二叉排序树,又称为二叉查找树或有序二叉树,它是一棵二叉树,具有以下性质: 1. **左子树**上的所有结点的值均小于它的根结点的值; 2. **右子树**上所有结点的值均大于它的根结点的值; 3. 左右子树也分别为二叉...
这种特性使得二叉搜索树在插入、删除和查找操作上具有较高的效率。 在"二叉搜索树统计单词频率"的问题中,我们首先需要读取用户输入的一段文本,将其中的单词提取出来。这个过程通常涉及到字符串处理,例如分隔符...
二叉排序树(Binary Search Tree),也称作二叉查找树或有序二叉树,是一种特殊的二叉树数据结构。它具有以下性质: 1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若任意节点的右子树...
二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它具有以下特性: 1. **节点属性**:每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和...