数据结构之二叉树(3)

来源:互联网 发布:lol淘宝权女友辣椒 编辑:程序博客网 时间:2024/04/27 13:23

由前面两讲,我们已经对二叉树有所了解了,这一次我们来讲一个特殊的二叉树,即二叉排序树,也称二叉查找树。

二叉排序树满足如下条件:

(1)是二叉树;

(2)对于每一个节点P来说,若其左子树不为空,则其左子树的各节点的值都小于节点P的值,若其右子树不为空,则其右子树中所有节点的值都大于节点P的值。

接下来我们使用JAVA语言实现二叉排序树,仅列出插入和删除函数的实现方式。

package mianshiti;import java.util.*;public class BinarySearchTree {private TreeNode root=null;//根节点public static void main(String[] args) {// TODO Auto-generated method stubBinarySearchTree mytree=new BinarySearchTree();mytree.insert(4);mytree.insert(2);mytree.insert(6);mytree.insert(1);mytree.insert(3);mytree.insert(5);mytree.insert(8);mytree.insert(7);mytree.delete(4);//BinarySearchTree<Character> tree=new BinarySearchTree<Character>(init());System.out.println("递归方式实现前序遍历:");mytree.preorder(mytree.getRoot());System.out.println();System.out.println("递归方式实现中序遍历:");mytree.inorder(mytree.getRoot());System.out.println();System.out.println("递归方式实现后序遍历:");mytree.postorder(mytree.getRoot());System.out.println();System.out.println("非递归方式实现前序遍历:");mytree.nonRecursivePreorder(mytree.getRoot());System.out.println();System.out.println("非递归方式实现中序遍历:");mytree.nonRecursiveInorder(mytree.getRoot());System.out.println();System.out.println("非递归方式实现后序遍历:");mytree.nonRecursivePostorder(mytree.getRoot());System.out.println();}//前序遍历public void preorder(TreeNode node){if(node!=null){this.getNodeInfo(node);preorder(node.left);preorder(node.right);}}//中序遍历public void inorder(TreeNode node){if(node!=null){inorder(node.left);this.getNodeInfo(node);inorder(node.right);}}//后序遍历public void postorder(TreeNode node){if(node!=null){postorder(node.left);postorder(node.right);this.getNodeInfo(node);}}//非递归方式实现前序遍历public void nonRecursivePreorder(TreeNode node){Stack<TreeNode> mystack=new Stack<TreeNode>();if(node!=null){mystack.push(node);while(!mystack.isEmpty()){TreeNode temp=mystack.pop();this.getNodeInfo(temp);if(temp.right!=null){mystack.push(temp.right);}if(temp.left!=null){mystack.push(temp.left);}}}}//非递归方式实现中序遍历public void nonRecursiveInorder(TreeNode node){Stack<TreeNode> mystack=new Stack<TreeNode>();while(node!=null){while(node!=null){if(node.right!=null){mystack.push(node.right);}mystack.push(node);node=node.left;}node=mystack.pop();while(!mystack.isEmpty()&&node.right==null){this.getNodeInfo(node);node=mystack.pop();}this.getNodeInfo(node);if(!mystack.isEmpty()){node=mystack.pop();}else{node=null;}}}//非递归方式实现后续遍历public void nonRecursivePostorder(TreeNode node){Stack<TreeNode> mystack=new Stack<TreeNode>();TreeNode temp=node;while(node!=null){for(;node.left!=null;node=node.left){mystack.push(node);}while(node!=null&&(node.right==null||node.right==temp)){this.getNodeInfo(node);temp=node;if(mystack.isEmpty())return;node=mystack.pop();}mystack.push(node);node=node.right;}}//构造函数public BinarySearchTree(){this.root=null;}public TreeNode getRoot(){return this.root;}//添加一个节点public void insert(int value){TreeNode nextnode=new TreeNode(value);TreeNode temp=this.root;if(this.root==null){this.root=nextnode;nextnode.parent=null;return ;}while(temp!=null){if(value<temp.data){if(temp.left==null){temp.left=nextnode;nextnode.parent=temp;return;}else{temp=temp.left;}}else if(value>temp.data){if(temp.right==null){temp.right=nextnode;nextnode.parent=temp;return;}else{temp=temp.right;}}}}//获取以begin为根节点的树的最小关键字节点的引用private TreeNode minTreeNode(TreeNode begin){if(begin==null)return null;while(begin.left!=null){begin=begin.left;}return begin;}//获取以begin为根节点的树的最大关键字节点的引用private TreeNode maxTreeNode(TreeNode begin){if(begin==null)return null;while(begin.right!=null){begin=begin.right;}return begin;}//删除一个节点public void delete(int value){if(this.root==null){System.out.println("树为空,无法删除"+value);return;}TreeNode temp=this.root;while(temp!=null){if(value>temp.data){if(temp.right==null){System.out.println("树中没有要删除的项");}else{temp=temp.right;}}else if(value<temp.data){if(temp.left==null){System.out.println("树中没有要删除的项");}else{temp=temp.left;}}else{//找到了这个节点if(temp.left==null&&temp.right==null)//该节点是叶节点{if(temp.parent.right==temp){temp.parent.right=null;}else{temp.parent.left=null;}}else if(temp.right!=null&&temp.left==null)//左子树为空,右子树不为空{if(temp.parent.right==temp){temp.parent.right=temp.right;temp.right.parent=temp.parent;}else{temp.parent.left=temp.right;temp.right.parent=temp.parent;}}else if(temp.left!=null&&temp.right==null)//左子树不为空,右子树为空{if(temp.parent.right==temp){temp.parent.right=temp.left;temp.left.parent=temp.parent;}else{temp.parent.left=temp.left;temp.left.parent=temp.parent;}}else//左右子树都不为空{TreeNode replacenode=minTreeNode(temp.right);delete(replacenode.data);temp.data=replacenode.data;}break;}}}public void getNodeInfo(TreeNode treenode){if(treenode!=null){System.out.print(treenode.data+" ");}}}class TreeNode{public int data;public TreeNode left;//左子节点public TreeNode right;//右子节点public TreeNode parent;//父节点//构造函数public TreeNode(int data){this(data,null,null,null);}public TreeNode(int data,TreeNode left,TreeNode right,TreeNode parent){this.data=data;this.left=left;this.right=right;this.parent=parent;}}

运行结果如下所示:

递归方式实现前序遍历:5 2 1 3 6 8 7 递归方式实现中序遍历:1 2 3 5 6 7 8 递归方式实现后序遍历:1 3 2 7 8 6 5 非递归方式实现前序遍历:5 2 1 3 6 8 7 非递归方式实现中序遍历:1 2 3 5 6 7 8 非递归方式实现后序遍历:1 3 2 7 8 6 5 



 

 

原创粉丝点击