`

二叉查找树系列

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 

 

 

分享到:
评论

相关推荐

    二叉查找树的一系列操作

    二叉查找树的一系列操作

    二叉排序树、插入、删除、查找等

    二叉排序树的各种操作(插入,删除,查找等)

    二叉查找树算法.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...

    数据结构伸展树splay.rar

    在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对...

    运用伸展树解决数列维护问题.pdf

    在伸展树上的一般操作都基于伸展操作:假设想要对一个二叉查找树执行一系列的查找操作,为了使整个查找时间更小,被查频率高的那些条目就应当经常处于靠近树根的位置。于是想到设计一个简单方法, 在每次查找之后对...

    Splay(C++)示例代码

    伸展树(Splay Tree),也叫分裂树,是一种二叉...伸展树是一种自调整形式的二叉查找树,它会沿着从某个节点到树根之间的路径,通过一系列的旋转把这个节点搬移到树根去。它的优势在于不需要记录用于平衡树的冗余信息。

    红黑树插入时的自平衡

    红黑树实质上是一棵自平衡的二叉查找树,引入带颜色的节点也是为了方便在进行插入或删除操作时,如果破坏了二叉查找树的平衡性能通过一系列变换保持平衡。 红黑树的性质 每个节点要么是红色,要么是黑色 根节点必须...

    JAVA实现读取TXT文件并建立平衡二叉树及查找功能

    3. 由TXT文本中读入一系列的数据,建立一棵平衡二叉树,并实现查找任何数据的功能,并能打印出结点的访问路径。 (Makefile编译)

    数据结构查找算法实验报告.doc

    需求和规格说明: 查找算法这里主要使用了顺序查找,折半查找,二叉排序树查找和哈希表查找四种方法 。由于自己能力有限,本想实现其他算法,但没有实现。其中顺序查找相对比较简单, 折半查找参考了书上的算法,...

    数据结构 查找算法

    1-----顺序查找 2------二分查找 3------二叉顺序树 包括hash树一系列的查找程序

    查找算法的比较

    二叉排序树则是先构造,构造部分花费最多的精力,比根节点数据大的结点放入根节点的右子树,比根节点数据小的放入根节点的左子树,其实完全可以利用递归实现,这里使用的循环来实现的,感觉这里可以尝试用递归。...

    平衡二叉树的所有操作(全)

    平衡二叉树的一系列操作:删除、插入(在二叉排序树中插入新结点后,如何保持平衡)、调整平衡等等等。 在二叉排序树中插入新结点后,如何保持平衡? 查找路径上的所有结点都有可能受到影响。 从插入点往回找到第...

    互联网Java面试训练营.rar

    5. 腾讯面试题:有了二叉查找树、平衡树为啥还需要红黑树? 6. 你真的了解 i++, ++i 和 i+++++i 以及 i+++i++ 吗? 7. 面试准备-《算法第4版》Java算法笔记、理解整理 8. Java基础知识面试题(总结最全面的面试题...

    数据结构基础系列(8):查找

    数据结构课程是计算机类专业的专业基础课程,在...系列课程包含11个部分,本课为第8部分查找,介绍查找的基本概念,重点是线性表上顺序查找、二分查找和分块查找,二叉排序树、AVL树和B-树的各种树表,以及哈希表查找。

    二叉堆.zip

    算法是解决特定问题或执行特定任务的一系列步骤或规则的有序集合。在计算机科学中,算法通常用来指导计算机执行特定的任务或解决问题。良好设计的算法能够有效地解决问题,并且在给定的输入下能够产生正确的输出。 ...

    DataStructure.Samples.CSharp:数据结构示例程序(C#语言描述)

    树与二叉树(中){二叉树的非预定归遍历与二叉查找树} 树与二叉树(下){二叉树的应用:恢复四则运算} ④图部分: 图(上){图的基本概念,存储结构与模拟实现} 图(中){图的深度与广度优先遍历算法与实现}

    数据结构算法

    第二天 平衡二叉树 6天通吃树结构—— 第一天 二叉查找树 算法速成系列(15)算法系列15天速成——第十五天 图【下】(大结局) 算法系列15天速成——第十四天 图【上】 算法系列15天速成——第十三天 树操作【下】 ...

    ~二叉树及其相关操作~

    二叉树综合实验,综合运用分治法与减治法,实现二叉排序树的一系列功能.包括: (1)插入新结点。 (2)前序,中序,后序遍历二叉树。 (3)层次遍历二叉树。 (4)在二叉树中查找给定关键字。 (5)交换各节点左右...

    word源码java-Java-Notes:基于java语言,实现常见的数据结构,算法,常用的开发技术,框架技术文档

    word源码java MAPLE NOTES 路过的小伙伴们,大家好,我是笑小枫,专注于JAVA开发 JAVA日常笔记 ...二叉搜索树: 平衡二叉树: 红黑树: 查找算法 二分查找: 排序算法 冒泡排序: 选择排序: 插入排序:

Global site tag (gtag.js) - Google Analytics