`

二叉查找树系列

J# 
阅读更多

 

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 

 

 

分享到:
评论

相关推荐

    二叉查找树 减治法——C++代码

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它的每个节点都包含一个键(key)、一个关联的值、一个指向左子树的引用和一个指向右子树的引用。在二叉查找树中,对于任意节点,其左子树中的...

    C++模板类二叉查找树的实现

    在C++编程中,二叉查找树(Binary Search Tree,简称BST)是一种常见的数据结构,它具有以下特性:对于任意节点,其左子树中的所有节点的值都小于该节点的值,右子树中所有节点的值都大于该节点的值。这种性质使得...

    二叉查找树C++实现

    `main.cpp`文件是程序的入口,它会创建二叉查找树实例,然后可能进行一系列插入、查找和删除操作,并打印出结果。例如: ```cpp #include "Binary_tree.h" // 或 "Search_tree.h" int main() { BinarySearchTree ...

    一种高效二叉查找树---红黑树

    ### 一种高效二叉查找树——红黑树 #### 一、引言 在计算机科学领域,二叉查找树(Binary Search Tree, BST)是一种非常重要的数据结构,它能够有效地实现查找、插入和删除等基本操作。然而,在某些情况下,普通的...

    C++二叉查找树的实现

    主函数首先初始化根节点为`NULL`,然后读取用户输入的一系列整数并依次插入二叉查找树中。最后,输出三种遍历方式的结果。 ### 三、总结 通过上述代码解析,我们了解了二叉查找树的基本概念、插入及遍历操作的具体...

    ABR.zip_abr_二叉查找树

    二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树数据结构,它具有以下特性:对于树中的每个节点,其左子树上的所有节点的值都小于该节点的值,而右子树上所有节点的值都大于该节点的值。这个特性使得二叉...

    最优二叉搜索树

    最优二叉搜索树,也称为最优化二叉查找树或者动态二叉搜索树,是计算机科学中的一个重要概念,尤其在算法设计与分析领域占据一席之地。这种数据结构主要用于提高查询效率,在某些特定操作序列下,它能比普通二叉搜索...

    数据结构-用户登录实验-二叉查找树AVL树实现

    本实验专注于二叉查找树(Binary Search Tree, BST)以及它的平衡版本——AVL树。这两种数据结构在处理大量数据时,尤其是进行查找、插入和删除操作时,具有较高的效率。 首先,二叉查找树是一种特殊的二叉树,其中...

    科大算法实验2红黑树和二叉查找树

    本实验主要探讨了两种经典的数据结构:红黑树(Red-Black Tree)和二叉查找树(Binary Search Tree,BST),这些都是科大算法实验2的重点内容。 二叉查找树是一种特殊的二叉树,其每个节点都包含一个键、一个关联值...

    二叉查找树的一系列操作

    二叉查找树的一系列操作

    数据结构课程设计 二叉排序树与平衡二叉排序树

    在描述中提到,我们需要以回车('\n')为输入结束标志,输入一系列数字来构建二叉排序树。这个过程可以通过以下步骤实现: 1. 初始化一个空的根节点。 2. 循环读取用户输入的数字,直到遇到回车。 3. 对每个输入的...

    数据结构课程设计二叉排序树的实现

    二叉排序树(Binary Search Tree, BST),又称二叉查找树或有序二叉树,是一种特殊的二叉树,其特点在于对于任意节点而言,其左子树中的所有节点的值均小于该节点的值,而右子树中的所有节点的值均大于该节点的值。...

    二叉链表和顺序表建二叉排序树

    在本篇文章中,我们将深入探讨如何利用二叉链表和顺序表两种不同的数据结构来构建二叉排序树(Binary Search Tree, BST),并通过具体示例来演示其创建、遍历以及查找性能分析的过程。 #### 二叉链表构建二叉排序树...

    二叉排序树的基本操作的实现.doc

    用户输入一系列数字(以0作为终止标识),程序逐个插入节点,构建二叉排序树。 2. **插入节点**:`Bstree Insert(Bstree tree, int key)`函数负责在已有的二叉排序树中插入新节点。当遇到已存在的键值时,不会插入...

    兰州大学数据结构实验全集 数据结构 链表 约瑟夫问题 KMP 模式匹配 二叉排序树 llink-rlink 关键路径 堆排序

    4. **二叉排序树**:也称为二叉查找树,是一种二叉树结构,其中每个节点的左子树只包含比它小的节点,右子树只包含比它大的节点。这种特性使得二叉排序树非常适合进行查找、插入和删除操作,且时间复杂度可以达到O...

    JS实现二叉查找树的建立以及一些遍历方法实现

    首先,二叉查找树由一系列节点组成,每个节点包含三个要素:数据域、左子节点引用和右子节点引用。数据域存储该节点存储的值,左、右子节点引用则指向该节点的左右子树。在JavaScript中,我们可以使用构造函数来定义...

    二叉排序树 二叉排序树

    二叉排序树,又称为二叉查找树或有序二叉树,它是一棵二叉树,具有以下性质: 1. **左子树**上的所有结点的值均小于它的根结点的值; 2. **右子树**上所有结点的值均大于它的根结点的值; 3. 左右子树也分别为二叉...

    二叉搜索树统计单词频率 MFC实现

    这种特性使得二叉搜索树在插入、删除和查找操作上具有较高的效率。 在"二叉搜索树统计单词频率"的问题中,我们首先需要读取用户输入的一段文本,将其中的单词提取出来。这个过程通常涉及到字符串处理,例如分隔符...

    数据结构课程设计——二叉排序树

    二叉排序树(Binary Search Tree),也称作二叉查找树或有序二叉树,是一种特殊的二叉树数据结构。它具有以下性质: 1. 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值; 2. 若任意节点的右子树...

    数据结构二叉排序树的实现

    二叉排序树(Binary Search Tree,BST),也称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构,它具有以下特性: 1. **节点属性**:每个节点包含一个键(key)、一个关联的值、一个指向左子节点的引用和...

Global site tag (gtag.js) - Google Analytics