二叉查找树的各种操作
来源:互联网 发布:淘宝网信用评价体系 编辑:程序博客网 时间:2024/06/06 00:39
马上要找工作了 ,复习一下基础。 写了二叉查找树的很多相关操作 包括递归和非递归,看代码。
package com.meran.tree;public class TNode {int key;TNode left;TNode right;TNode parent;public TNode(int key,TNode left,TNode right,TNode parent){this.key=key;this.left=left;this.right=right;this.parent=parent;}public TNode(int key,TNode parent){this.key=key;this.left=null;this.right=null;this.parent=parent;}}
package com.meran.tree;import java.util.LinkedList;public class BinarySearchTree {TNode root ;//非递归方法插入节点public void iterativeInsertNode(int i){TNode p =root,prev=null;while(p!=null){prev=p;if(i<p.key)p=p.left;elsep=p.right;}if(root==null)root=new TNode(i,null);elseif(prev.key<i){TNode temp=new TNode(i,prev);prev.right=temp;temp.parent=prev;}else{TNode temp=new TNode(i,prev);prev.left=temp;temp.parent=prev;}};//递归方式插入public void insertNode(int i){TNode prev=getPosition(i,root,root);if(prev==null)root=new TNode(i,null);else if(i<prev.key)prev.left=new TNode(i,prev);elseprev.right=new TNode(i,prev);}private TNode getPosition(int i,TNode p,TNode prev){ if(p!=null){prev=p;if(i<p.key) returngetPosition(i,p.left,prev);else returngetPosition(i,p.right,prev);}return prev;}public void preorder(TNode p){if(p!=null){ visit(p); preorder(p.left); preorder(p.right);}}public void inorder(TNode p){if(p!=null){inorder(p.left); visit(p); inorder(p.right);}}public void postorder(TNode p){if(p!=null){postorder(p.left);postorder(p.right);visit(p);}}private void visit(TNode p){System.out.println(p.key);}//非递归查找public TNode iterativeSearch(int i){TNode p=root;while(p!=null){if(p.key==i)return p;else if(i<p.key)p=p.left;elsep=p.right;}return null;}//递归查找public TNode search(TNode p,int i){ if(p!=null){ if(p.key==i) return p; else if(i<p.key) search(p.left,i); else search(p.right,i); } return null;}//非递归前序遍历public void iterativePreorder(){TNode p=root;LinkedList<TNode> list=new LinkedList<TNode>();if(p!=null){list.addFirst(p);while(!list.isEmpty()){p=list.poll();visit(p);if(p.right!=null)list.addFirst(p.right); if(p.left!=null)list.addFirst(p.left);}}}//非递归后序遍历 public void iterativePostorder(){TNode p=root;TNode q=p;LinkedList<TNode> list=new LinkedList<TNode>(); while(p!=null){ for(;p.left!=null;p=p.left) list.addFirst(p); //无右子或者右子已打印 while(p!=null&&(p.right==null||p.right==q)){ visit(p); q=p; if(list.isEmpty()) return; p=list.poll(); } //处理右子 list.addFirst(p); p=p.right; }}// 广度优先遍历public void breadthFirst(){TNode p=root;LinkedList<TNode> list=new LinkedList<TNode>();if(p!=null){list.addLast(p);while(!list.isEmpty()){p=list.poll();visit(p);if(p.left!=null)list.addLast(p.left);if(p.right!=null)list.addLast(p.right);}}}//返回最小值非递归public TNode iterativeminMum(){TNode p=root;while(p.left!=null){p=p.left;}return p;}//返回最大值非递归public TNode iterativemimMum(){TNode p=root;while(p.right!=null)p=p.right;return p;}//返回最大值递归public TNode maxMum(TNode p){if(p.right!=null)return minMum(p.right);return p;}//返回最小值递归public TNode minMum(TNode p){if(p.left!=null)return minMum(p.left);return p;}//返回节点的后继public TNode successor(TNode p){if(p.right!=null)return minMum(p.right); TNode y=p.parent; while(y!=null&&y==y.parent.right) { p=y; y=y.parent; } return y;}//返回节点的前驱 public TNode predecessor(TNode p){ if(p.left!=null) return maxMum(p.left); TNode y=p.parent; while(y!=null&&y==y.parent.left){ p=y; y=y.parent; } return y; } public void delete(TNode p){ TNode y=new TNode(0,null); TNode x=new TNode(0,null); if(p.left==null||p.right==null) y=p; else y=successor(p); //选择需要被删除的元素 if(y.left!=null) x=y.left; else x=y.right; if(x!=null) x.parent=y.parent; //删除y if(y.parent==null) root=y;//如果y是根 else if(y==y.parent.left) y.parent.left=x; else y.parent.right=x; if(y!=p) p.key=y.key; } public static void main(String [] args){ BinarySearchTree tree=new BinarySearchTree(); TNode node3=new TNode(4,null,null,null); TNode node1=new TNode(3,null,node3,null); TNode node2=new TNode(6,null,null,null); TNode node7=new TNode(9,null,null,null); TNode node6=new TNode(8,null,node7,null); TNode node5=new TNode(10,node6,null,null); TNode node4=new TNode(7,node2,node5,null); TNode root=new TNode(5,node1,node4,null); node1.parent=root; node2.parent=node4; node4.parent=root; node5.parent=node4; node3.parent=node1; node6.parent=node5; node7.parent=node6; tree.root=root; // tree.inorder(tree.root); // System.out.println( tree.successor(root).key);// System.out.print( tree.predecessor(root).key); tree.delete(root); tree.iterativePostorder(); //tree.delete(node5);// tree.iterativePreorder(); //tree.preorder(tree.root); // tree.postorder(tree.root); } }
- 二叉查找树的各种操作
- 二叉查找树的各种操作
- 二叉查找树的各种操作源码
- 二叉查找树的各种操作
- 二叉查找树的各种操作C++实现
- java实现一个二叉查找树的各种操作
- 二叉查找树的各种操作C++实现
- 二叉查找树 各种操作及其初始化
- 二叉查找树的各种操作(插入、删除、查找、遍历)
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉树的各种操作
- 二叉查找树的操作
- 二叉查找树的操作
- 源特定组播(SSM:Source Specific Multicast)
- Android 开机启动研究
- JVM内存泄漏检测与处理
- 关于时间分配
- VC Slider控件,根据鼠标单击位置来显示滑块位置!
- 二叉查找树的各种操作
- Apple Developer 注册(转)
- Enterprise Library 5.0 研究 <1> 认识Enterprise Library 5.0
- 什么样的机缘,什么样的情况。
- %type %rowtype record table
- JAVA 多线程
- Javascript 局部变量
- 分析strcpy函数
- 【文档规范】需求分析报告 VS 需求说明书 VS 需求规格说明书